开发者社区 问答 正文

Java-SDK之如何实现管理文件(三)?


通过ListObjectsRequest列出文件


可以通过设置ListObjectsReques的参数实现各种灵活的查询功能。ListObjectsReques的可设置的参数如下:

参数作用方法
Prefix限定返回的object key必须以prefix作为前缀。setPrefix(String prefix)
Delimiter是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes。setDelimiter(String delimiter)
Marker设定结果从marker之后按字母排序的第一个开始返回。setMarker(String marker)
MaxKeys限定此次返回object的最大数,如果不设定,默认为100,max-keys取值不能大于1000。setMaxKeys(Integer maxKeys)
EncodingType请求响应体中Object名称采用的编码方式,目前支持url。setEncodingType(String encodingType)


指定最大返回条数

  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 创建OSSClient实例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. final int maxKeys = 200;
  9. // 列举Object
  10. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMaxKeys(maxKeys));
  11. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  12. for (OSSObjectSummary s : sums) {
  13.     System.out.println("\t" + s.getKey());
  14. }
  15. // 关闭client
  16. ossClient.shutdown();


返回指定前缀的object


最多返回100条。
  1. final String keyPrefix = "<keyPrefix>"
  2. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withPrefix(keyPrefix));
  3. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  4. for (OSSObjectSummary s : sums) {
  5.     System.out.println("\t" + s.getKey());
  6. }


从指定Object后返回


不包括指定的Object,最多返回100条。
  1. final String keyMarker = "<keyMarker>"
  2. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(keyMarker));
  3. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  4. for (OSSObjectSummary s : sums) {
  5.     System.out.println("\t" + s.getKey());
  6. }


分页获取所有Object


分页获取所有Object,每页maxKeys条Object。
  1. final int maxKeys = 200;
  2. String nextMarker = null;
  3. do {
  4.     objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(nextMarker).withMaxKeys(maxKeys));
  5.     List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  6.     for (OSSObjectSummary s : sums) {
  7.         System.out.println("\t" + s.getKey());
  8.     }
  9.     nextMarker = objectListing.getNextMarker();
  10. } while (objectListing.isTruncated());


分页获取所有特定Object后的Object


分页获取所有特定Object后的Object,每页maxKeys条Object。
  1. final int maxKeys = 200;
  2. String nextMarker = "<nextMarker>";
  3. do {
  4.     objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(nextMarker).withMaxKeys(maxKeys));
  5.     List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  6.     for (OSSObjectSummary s : sums) {
  7.         System.out.println("\t" + s.getKey());
  8.     }
  9.     nextMarker = objectListing.getNextMarker();
  10. } while (objectListing.isTruncated());






展开
收起
青衫无名 2017-10-18 10:58:46 1746 分享 版权
阿里云 AI 助理回答

您已经很好地总结了使用阿里云对象存储服务(OSS)的Java SDK来实现不同查询需求的方法,包括指定最大返回条数、返回指定前缀的Object、从指定Object后返回以及分页获取所有Object或特定Object后的Object。这里我再简要概括一下并补充一些细节:

  1. 指定最大返回条数:

    // 设置每次请求最多返回200条记录
    final int maxKeys = 200;
    ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMaxKeys(maxKeys));
    
  2. 返回指定前缀的object:

    final String keyPrefix = "your_prefix/";
    ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withPrefix(keyPrefix));
    
  3. 从指定Object后返回:

    final String keyMarker = "your_key_marker";
    ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(keyMarker));
    
  4. 分页获取所有Object:

    final int maxKeys = 200;
    String nextMarker = null;
    do {
       objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
       List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
       for (OSSObjectSummary s : sums) {
           System.out.println("\t" + s.getKey());
       }
       nextMarker = objectListing.getNextMarker();
    } while (objectListing.isTruncated());
    
  5. 分页获取所有特定Object后的Object: 这部分代码示例与第4点基本一致,只需确保nextMarker初始值设置正确,或者直接用特定的keyMarker开始循环。

注意: - 在所有示例中,请确保替换bucketName为您实际的Bucket名称。 - keyPrefixkeyMarker应根据您的具体需求进行设置。 - 使用完OSSClient后调用ossClient.shutdown()是非常重要的,以确保资源被正确释放。 - 如果需要处理大量文件或频繁操作,考虑性能和成本优化,比如使用异步客户端OSSAsyncClient或合理安排请求频率避免触发频控。

希望这些信息能帮助您更好地管理和查询阿里云OSS中的文件。如果有更具体的问题或需要进一步的帮助,请随时告诉我!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答