Google cloud storage 在Java中按特定表达式列出GCS中的文件

Google cloud storage 在Java中按特定表达式列出GCS中的文件,google-cloud-storage,google-cloud-dataflow,Google Cloud Storage,Google Cloud Dataflow,以前有人实现过这个功能吗?它相当于unix中的ls-ltr*xyz*,我希望在我的云数据流代码中实现同样的效果。 任何线索都将不胜感激 谢谢。GCS支持前缀查询,您可以高效地列出xyz*;但是要列出xyz,您必须在客户端列出整个bucket并进行筛选。可以在客户端进行此筛选。下面是一个使用java客户端库访问Google云存储API的示例 下面的示例列出了bucket根目录中与给定正则表达式模式匹配的所有文件 我使用了正则表达式,而不是像ls这样的shell命令所支持的glob模式,因为正则表达

以前有人实现过这个功能吗?它相当于unix中的ls-ltr*xyz*,我希望在我的云数据流代码中实现同样的效果。 任何线索都将不胜感激


谢谢。

GCS支持前缀查询,您可以高效地列出xyz*;但是要列出xyz,您必须在客户端列出整个bucket并进行筛选。

可以在客户端进行此筛选。下面是一个使用java客户端库访问Google云存储API的示例

下面的示例列出了bucket根目录中与给定正则表达式模式匹配的所有文件

我使用了正则表达式,而不是像
ls
这样的shell命令所支持的glob模式,因为正则表达式更灵活

我建议你通过考试

例子
import com.google.api.gax.paging.Page;
导入com.google.cloud.storage.Blob;
导入com.google.cloud.storage.storage;
导入com.google.cloud.storage.storage.BlobListOption;
导入com.google.cloud.storage.StorageOptions;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.regex.Pattern;
/**
*列出指定GCS存储桶中与
*指定的正则表达式模式。
*
*以程序名运行它
*/
公共类ListBlobsSample{
公共静态void main(字符串[]args)引发IOException{
//实例化存储客户端
Storage Storage=StorageOptions.getDefaultInstance().getService();
//GCS存储桶的名称
字符串bucketName=args[0];
//用于匹配GCS存储桶中Blob的正则表达式。
//示例:'.*abc.*'
字符串matchExpr=args[1];
List results=listBlobs(存储,bucketName,Pattern.compile(matchExpr));
System.out.println(“结果:+Results.size()+items”);
for(字符串结果:结果){
System.out.println(“Blob:+result”);
}
}
//列出bucket中与表达式匹配的所有blob。
//在此处指定正则表达式。示例:'.*abc.*'
私有静态列表ListBlob(存储、字符串bucketName、模式匹配模式)
抛出IOException{
列表结果=新建ArrayList();
//仅列出当前目录中的Blob
//(否则,您也会从子目录中获得结果)。
bloblistotion listOptions=bloblistotion.currentDirectory();
页面blobs=storage.list(bucketName,listOptions);
for(Blob Blob:blobs.iterateAll()){
如果(!blob.isDirectory()&&matchPattern.matcher(blob.getName()).matches()){
add(blob.getName());
}
}
返回结果;
}
}
仅使用前缀匹配 如果您需要只匹配对象名称中的前缀,则支持它

执行
GET时,需要在请求中指定
前缀
查询参数https://www.googleapis.com/storage/v1/b/bucket/o
。java客户端库也支持这一点(在构建传递给
storage.list()
BlobListOption
时,必须指定它)

前缀

将结果筛选到名称以此前缀开头的对象

gsutil
gsutil
支持此类查询,并且它仅在客户端进行过滤(在某些情况下,它也会发出多个请求)。

以下内容可能对您的用例没有帮助,但如果您希望将结果缩小到某个前缀,然后应用正则表达式以匹配最终正则表达式

 Storage storage = StorageOptions.getDefaultInstance().getService();
 Bucket bucket = storage.get(bucketName)
 BlobListOption blobListOption = Storage.BlobListOption.prefix(prefixPattern)
 for (Blob blob : bucket.list(blobListOption).iterateAll()) {
    System.out.println(blob);
 }

@BalajeeVenkatesh-我添加了一个非常基本但有效的示例,该示例在结果上使用正则表达式模式匹配,还添加了对库的java文档的参考以供进一步参考。感谢您的帮助,但在付出了大量努力之后,我还无法在我的Eclipse中使用它。我想这些都是我用来解决依赖关系的jar版本的问题。基本上,“StorageOptions”和“Page”类在红线下。你能分享一下你用来让这段代码正常运行的“gax”和“storage”相关jar的版本吗?我建议你研究一下某种形式的依赖项/包管理工具,比如
maven
,它可以让你轻松地提取依赖项。原因是您必须下载一整套JAR以满足所有依赖项(即依赖项的依赖项等)。如果您使用
maven
或任何流行的java依赖项管理工具,您需要添加到配置中以提取依赖项的行列在@BalajeeVenkatesh中-您面临的问题与您最初的问题大不相同,如果您在构建项目和处理依赖项方面遇到问题,我建议您单独问一个问题。
 Storage storage = StorageOptions.getDefaultInstance().getService();
 Bucket bucket = storage.get(bucketName)
 BlobListOption blobListOption = Storage.BlobListOption.prefix(prefixPattern)
 for (Blob blob : bucket.list(blobListOption).iterateAll()) {
    System.out.println(blob);
 }