如何在Azure Blob容器中获取文件夹名及指定文件夹下的所有文件
解决方案
1、获取容器内所有符合前缀要求的文件夹名称
Azure Blob 存储是扁平结构,我们看到的「文件夹」实际是 blob 名称前缀模拟的虚拟目录。你调用listBlobs方法时关闭扁平化遍历开关,即可筛选出当前层级的所有虚拟目录:
Iterable<ListBlobItem> rootItems = container.listBlobs(null, false, EnumSet.noneOf(BlobListingDetails.class), null, null); List<CloudBlobDirectory> targetDirs = new ArrayList<>(); for (ListBlobItem item : rootItems) { // 仅处理虚拟目录类型的项 if (item instanceof CloudBlobDirectory) { CloudBlobDirectory dir = (CloudBlobDirectory) item; // getPrefix默认返回带末尾/的路径,这里去掉后缀提取纯文件夹名 String dirName = dir.getPrefix().replaceAll("/$", ""); // 匹配DATA_FILE_前缀规则 if (dirName.startsWith("DATA_FILE_")) { targetDirs.add(dir); } } }
遍历完成后targetDirs列表里就存了所有符合要求的文件夹对象,也可以自行提取dirName存纯名称列表。
2、批量获取多个指定文件夹下的所有文件
你已经实现了单个文件夹的文件读取逻辑,只要遍历上面拿到的目标文件夹列表,复用现有逻辑即可,完整整合代码如下:
import com.microsoft.azure.storage.CloudStorageAccount; import com.microsoft.azure.storage.blob.*; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; public class BlobProcessor { public static void main(String[] args) throws Exception { String connStr = "你的Azure存储连接字符串"; CloudStorageAccount c = CloudStorageAccount.parse(connStr); CloudBlobClient blobClient = c.createCloudBlobClient(); CloudBlobContainer container = blobClient.getContainerReference("testcontainer"); // 第一步:筛选目标文件夹 Iterable<ListBlobItem> rootItems = container.listBlobs(null, false, EnumSet.noneOf(BlobListingDetails.class), null, null); List<CloudBlobDirectory> targetDirs = new ArrayList<>(); for (ListBlobItem item : rootItems) { if (item instanceof CloudBlobDirectory) { CloudBlobDirectory dir = (CloudBlobDirectory) item; String dirName = dir.getPrefix().replaceAll("/$", ""); if (dirName.startsWith("DATA_FILE_")) { targetDirs.add(dir); } } } // 第二步:遍历每个文件夹读取所有文件 for (CloudBlobDirectory dir : targetDirs) { Iterable<ListBlobItem> blobs = dir.listBlobs(); for (ListBlobItem blobItem : blobs) { // 加类型判断避免子目录强转报错 if (blobItem instanceof CloudBlockBlob) { ByteArrayOutputStream output = new ByteArrayOutputStream(); CloudBlockBlob blob = (CloudBlockBlob) blobItem; blob.download(output); // 你的原有业务处理逻辑 } } } } }
补充说明
如果需要读取文件夹下所有嵌套层级的文件,把dir.listBlobs()替换为dir.listBlobs(null, true, EnumSet.noneOf(BlobListingDetails.class), null, null)即可,第二个参数设为true代表开启扁平化遍历,会返回该目录下所有层级的blob。
内容的提问来源于stack exchange,提问作者once
相关产品推荐
相关产品推荐

