查看Bucket中的Object
简单查询
查看Bucket中Object列表。
基本流程
- 创建BOSClient类的实例。
- 执行BOSClient.listObjects(bucketName)方法,会返回ListObjectsResponse类的实例。
- 对ListObjectsResponse类型可以进行getBuckets()/getOwner()/getMetadata()操作。
示例代码
1// 获取指定Bucket下的所有Object信息
2ListObjectsResponse listing = client.listObjects(<BucketName>);
3
4// 遍历所有Object
5for (BosObjectSummary objectSummary : listing.getContents()) {
6 System.out.println("ObjectKey: " + objectSummary.getKey());
7}
说明: listObjects( )方法返回ListObjectsResponse对象,ListObjectsResponse对象包含了此次listObject请求的返回结果。用户可以通过ListObjectsResponse中的getContents方法获取所有Object的描述信息。
- 默认情况下,如果Bucket中的Object数量大于1000,则只会返回1000个Object,并且返回结果中IsTruncated值为True,并返回NextMarker做为下次读取的起点。
- 若想获取更多的Object,可以使用Marker参数分次读取,请参考扩展查询。
完整示例
1import android.app.Activity;
2import android.os.Bundle;
3import com.baidubce.BceClientException;
4import com.baidubce.BceServiceException;
5import com.baidubce.auth.DefaultBceCredentials;
6import com.baidubce.demo.R;
7import com.baidubce.services.bos.BosClient;
8import com.baidubce.services.bos.BosClientConfiguration;
9import com.baidubce.services.bos.model.BosObjectSummary;
10import com.baidubce.services.bos.model.ListObjectsResponse;
11
12public class ExampleActivity extends Activity {
13
14private String bucketName = <BucketName>;
15
16@Override
17protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_main);
20 new Thread(new Runnable() {
21 @Override
22 public void run() {
23 try {
24 BosClientConfiguration config = new BosClientConfiguration();
25 config.setCredentials(new DefaultBceCredentials(<AccessKeyId>, <SecretAccessKey>));
26 config.setEndpoint(<EndPoint>);
27 BosClient client = new BosClient(config);
28
29 // 获取指定Bucket下的所有Object信息
30 ListObjectsResponse listing = client.listObjects(<BucketName>);
31
32 // 遍历所有Object
33 for (BosObjectSummary objectSummary : listing.getContents()) {
34 System.out.println("ObjectKey: " + objectSummary.getKey());
35 }
36
37 } catch (BceServiceException e) {
38 System.out.println("Error ErrorCode: " + e.getErrorCode());
39 System.out.println("Error RequestId: " + e.getRequestId());
40 System.out.println("Error StatusCode: " + e.getStatusCode());
41 System.out.println("Error Message: " + e.getMessage());
42 System.out.println("Error ErrorType: " + e.getErrorType());
43 } catch (BceClientException e) {
44 System.out.println("Error Message: " + e.getMessage());
45 }
46 }
47 }).start();
48}}
扩展查询
用户可以通过设置ListObjectsRequest参数来完成更多扩展查询操作设置。ListObjectsRequest中可以设置的扩展参数如下:
参数名称 | 说明 | 默认值 |
---|---|---|
MaxKeys | 设定此次返回Object的最大个数,不可超过1000。 | 1000 |
Prefix | 设定objectKey的前缀,前缀是指objectKey包含并以Prefix的值作为开始。 通常与Delimiter配合在查询模拟文件夹中使用。 |
- |
Delimiter | 是一个分隔符,用来对objectKey进行分层。 通常与Prefix配合在查询模拟文件夹中使用。 从Prefix开始到第一次出现Delimiter字符之间的objectKey称为:CommonPrefixes。 |
- |
Marker | 是一个字符串,用来设定返回结果的起始位置。 设定Marker值之后,返回的Object会从Marker值之后按字母排序开始返回。 |
- |
基本流程
- 创建ListObjectsRequest类的实例。
- 在ListObjectsRequest中执行setDelimiter/setMarker()/setPrefix()等方法,实现更多的扩展查询操作。
- 创建BOSClient类的实例,执行listObjects(listObjectsRequest)。
示例代码
1// 构造ListObjectsRequest请求
2ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
3
4// 设置扩展查询参数
5listObjectsRequest.setDelimiter(<Delimiter>);
6listObjectsRequest.setMarker(<Marker>);
7...
8ListObjectsResponse listing = client.listObjects(listObjectsRequest);
说明:上面代码中调用了
listObjects
中的一个重载方法,通过传入ListObjectsRequest
来完成请求。
完整示例
示例一:
1import android.app.Activity;
2import android.os.Bundle;
3import com.baidubce.BceClientException;
4import com.baidubce.BceServiceException;
5import com.baidubce.auth.DefaultBceCredentials;
6import com.baidubce.demo.R;
7import com.baidubce.services.bos.BosClient;
8import com.baidubce.services.bos.BosClientConfiguration;
9import com.baidubce.services.bos.model.BosObjectSummary;
10import com.baidubce.services.bos.model.ListObjectsRequest;
11import com.baidubce.services.bos.model.ListObjectsResponse;
12
13public class ExampleActivity extends Activity {
14
15private String bucketName = <BucketName>;
16
17@Override
18protected void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21 new Thread(new Runnable() {
22 @Override
23 public void run() {
24 try {
25 BosClientConfiguration config = new BosClientConfiguration();
26 config.setCredentials(new DefaultBceCredentials(<AccessKeyID>, <SecretAccessKey>));
27 config.setEndpoint(<EndPoint>);
28 BosClient client = new BosClient(config);
29
30 // 构造ListObjectsRequest请求
31 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
32
33 // 设置参数
34 listObjectsRequest.setDelimiter("/");
35 listObjectsRequest.setMarker("123");
36 listObjectsRequest.setMaxKeys(100);
37 listObjectsRequest.setPrefix("fun");
38
39 // 获取指定Bucket下符合上述条件的所有Object信息
40 ListObjectsResponse listing = client.listObjects(listObjectsRequest);
41
42 // 遍历所有Object
43 for (BosObjectSummary objectSummary : listing.getContents()) {
44 System.out.println("ObjectKey: " + objectSummary.getKey());
45 }
46
47 } catch (BceServiceException e) {
48 System.out.println("Error ErrorCode: " + e.getErrorCode());
49 System.out.println("Error RequestId: " + e.getRequestId());
50 System.out.println("Error StatusCode: " + e.getStatusCode());
51 System.out.println("Error Message: " + e.getMessage());
52 System.out.println("Error ErrorType: " + e.getErrorType());
53 } catch (BceClientException e) {
54 System.out.println("Error Message: " + e.getMessage());
55 }
56 }
57 }).start();
58}}
示例二:使用Nextmarker完整示例。
1import android.app.Activity;
2import android.os.Bundle;
3import com.baidubce.BceClientException;
4import com.baidubce.BceServiceException;
5import com.baidubce.auth.DefaultBceCredentials;
6import com.baidubce.demo.R;
7import com.baidubce.services.bos.BosClient;
8import com.baidubce.services.bos.BosClientConfiguration;
9import com.baidubce.services.bos.model.BosObjectSummary;
10import com.baidubce.services.bos.model.ListObjectsRequest;
11import com.baidubce.services.bos.model.ListObjectsResponse;
12
13public class ExampleActivity extends Activity {
14
15private String bucketName = <BucketName>;
16
17@Override
18protected void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21 new Thread(new Runnable() {
22 @Override
23 public void run() {
24 try {
25 BosClientConfiguration config = new BosClientConfiguration();
26 config.setCredentials(new DefaultBceCredentials(<AccessKeyId>, <SecretAccessKey>);
27 config.setEndpoint(<EndPoint>);
28 BosClient client = new BosClient(config);
29 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
30 listObjectsRequest.setMarker("");
31 listObjectsRequest.setMaxKeys(20);
32 listObjectsRequest.setDelimiter(BceConfig.BOS_DELIMITER);
33 ListObjectsResponse listObjectsResponse = client.listObjects(listObjectsRequest);
34 String nextMark = "";
35 if(listObjectsResponse.isTruncated()){
36 nextMark = listObjectsResponse.getNextMarker();
37 }
38
39 ListObjectsRequest listObjectsRequest2 = new ListObjectsRequest(<BucketName>);
40 listObjectsRequest2.setMarker(nextMark);
41 listObjectsRequest2.setMaxKeys(20);
42 listObjectsRequest2.setDelimiter(BceConfig.BOS_DELIMITER);
43 ListObjectsResponse listing = client.listObjects(listObjectsRequest2);
44
45 for (BosObjectSummary objectSummary : listing.getContents()) {
46 System.out.println("ObjectKey: " + objectSummary.getKey());
47 }
48
49 } catch (BceServiceException e) {
50 System.out.println("Error ErrorCode: " + e.getErrorCode());
51 System.out.println("Error RequestId: " + e.getRequestId());
52 System.out.println("Error StatusCode: " + e.getStatusCode());
53 System.out.println("Error Message: " + e.getMessage());
54 System.out.println("Error ErrorType: " + e.getErrorType());
55 } catch (BceClientException e) {
56 System.out.println("Error Message: " + e.getMessage());
57 }
58 }
59 }).start();
60}}
查询模拟文件夹
由于BOS本身是一个(<Key>,<Value>
)的存储系统,所以原则上并不会存在“文件夹”的概念,但您可以通过 Delimiter
和 Prefix
参数的配合进行文件夹功能模拟。
假设Bucket中有5个文件:bos.jpg,fun/,fun/test.jpg,fun/movie/001.avi,fun/movie/007.avi,可以把 “/” 符号作为分隔符模拟文件夹。
递归列出模拟文件夹下所有文件
可以通过设置 Prefix
参数来获取某个模拟文件夹下所有的文件:
1// 构造ListObjectsRequest请求
2ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
3
4// 递归列出fun文件夹下的所有文件
5listObjectsRequest.setPrefix("fun/");
6
7ListObjectsResponse listing = client.listObjects(listObjectsRequest);
8
9// 遍历所有Object
10System.out.println("Objects:");
11for (BosObjectSummary objectSummary : listing.getContents()) {
12 System.out.println(objectSummary.getKey());
13}
输出:
1Objects:
2fun/
3fun/movie/001.avi
4fun/movie/007.avi
5fun/test.jpg
查看模拟文件夹下的文件和子文件夹
在 Prefix
和 Delimiter
结合的情况下,可以列出模拟文件夹下的文件和子文件夹:
1// 构造ListObjectsRequest请求
2ListObjectsRequest listObjectsRequest = new ListObjectsRequest(<BucketName>);
3
4// 指定"/" 为模拟文件夹的分隔符
5listObjectsRequest.setDelimiter("/");
6
7// 列出fun文件夹下的所有文件和子文件夹
8listObjectsRequest.setPrefix("fun/");
9
10ListObjectsResponse listing = client.listObjects(listObjectsRequest);
11
12// 遍历所有Object
13System.out.println("Objects:");
14for (BosObjectSummary objectSummary : listing.getContents()) {
15 System.out.println(objectSummary.getKey());
16}
17
18// 遍历所有CommonPrefix
19System.out.println("\nCommonPrefixs:");
20for (String commonPrefix : listing.getCommonPrefixes()) {
21 System.out.println(commonPrefix);
22}
输出:
1Objects:
2fun/
3fun/test.jpg
4
5CommonPrefixs:
6fun/movie/
说明:
返回的结果中,
Objects
的列表中给出的是fun文件夹下的文件。而CommonPrefixs
的列表中给出的是fun文件夹下的所有子文件夹。可以看出fun/movie/001.avi
,fun/movie/007.avi
两个文件并没有被列出来,因为它们属于fun
文件夹下的movie
子文件夹下的文件。