如何仅从GCP存储桶的指定目录读取文件?
解决GCP存储桶仅读取指定目录下文件的问题
当前你使用的getObjectsInDirectory方法会递归遍历所有子目录,要实现仅读取指定目录下的文件,可以从以下两种方式入手:
方式一:修改封装的storageService方法
如果storageService是你自己封装的工具类,可以直接修改方法逻辑,只筛选当前目录的对象(GCP存储桶本质是扁平结构,"目录"只是对象键的前缀):
import com.google.cloud.storage.Blob; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import java.io.InputStream; import java.util.HashMap; import java.util.Map; public Map<String, InputStream> getObjectsInDirectoryOnly(String path, String bucket) { Storage storage = StorageOptions.getDefaultInstance().getService(); Map<String, InputStream> currentDirFiles = new HashMap<>(); // 确保前缀以/结尾,避免匹配名称包含该路径的其他文件 String prefix = path.endsWith("/") ? path : path + "/"; for (Blob blob : storage.list(bucket, Storage.BlobListOption.prefix(prefix)).iterateAll()) { String relativePath = blob.getName().substring(prefix.length()); // 过滤条件:排除目录本身、仅保留当前目录下的文件(相对路径不含/) if (!relativePath.isEmpty() && !relativePath.contains("/")) { currentDirFiles.put(blob.getName(), blob.getContent()); } } return currentDirFiles; }
方式二:对现有结果进行过滤
如果无法修改storageService,可以在获取到全量文件后,通过流过滤出仅当前目录的文件:
import java.util.Map; import java.util.stream.Collectors; // 先获取全量文件 Map<String, InputStream> allFiles = this.storageService.getObjectsInDirectory(path, bucket); // 处理前缀格式 String prefix = path.endsWith("/") ? path : path + "/"; // 过滤出仅当前目录的文件 Map<String, InputStream> currentDirFiles = allFiles.entrySet().stream() .filter(entry -> { String objectKey = entry.getKey(); if (!objectKey.startsWith(prefix)) { return false; } String relativePath = objectKey.substring(prefix.length()); // 确保是当前目录下的文件,而非子目录内容或目录本身 return !relativePath.isEmpty() && !relativePath.contains("/"); }) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
核心逻辑说明
GCP存储没有真正的目录结构,所有对象都是通过键(Key)存储的。我们通过以下规则筛选:
- 确保对象键以指定目录的前缀开头(且前缀以
/结尾,避免误匹配) - 去掉前缀后的相对路径中不包含
/,说明该对象直接在指定目录下,而非子目录中
内容的提问来源于stack exchange,提问作者Anukul
相关产品推荐
相关产品推荐

