本文收錄于【#云計(jì)算入門(mén)與實(shí)踐 - AWS】專(zhuān)欄中,收錄 AWS 入門(mén)與實(shí)踐相關(guān)博文。
本文同步于個(gè)人公眾號(hào):【云計(jì)算洞察】
更多關(guān)于云計(jì)算技術(shù)內(nèi)容敬請(qǐng)關(guān)注:CSDN【#云計(jì)算入門(mén)與實(shí)踐 - AWS】專(zhuān)欄。
本系列已更新博文:
- [ 云計(jì)算 | AWS 實(shí)踐 ] Java 應(yīng)用中使用 Amazon S3 進(jìn)行存儲(chǔ)桶和對(duì)象操作完全指南
- [ 云計(jì)算 | AWS 實(shí)踐 ] Java 如何重命名 Amazon S3 中的文件和文件夾
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 列出存儲(chǔ)桶中的所有 AWS S3 對(duì)象
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 更新現(xiàn)有 Amazon S3 對(duì)象
- [ 云計(jì)算 | AWS 實(shí)踐 ] 基于 Amazon S3 協(xié)議搭建個(gè)人云存儲(chǔ)服務(wù)
- [ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 檢查指定的密鑰是否存在于給定的 Amazon S3 存儲(chǔ)桶中
一、前言
在本文中,我們將重點(diǎn)介紹如何使用 Java 列出 S3 存儲(chǔ)桶中的所有對(duì)象。我們將討論如何使用適用于 Java 的 AWS 開(kāi)發(fā)工具包與 S3 進(jìn)行交互,并查看不同用例的示例。
重點(diǎn)是使用適用于 Java 的 AWS 開(kāi)發(fā)工具包 V2,該開(kāi)發(fā)工具包相對(duì)于之前的版本有多項(xiàng)改進(jìn),例如增強(qiáng)的性能、非阻塞 I/O 和用戶(hù)友好的 API 設(shè)計(jì)。
二、前期準(zhǔn)備
要列出 S3 存儲(chǔ)桶中的所有對(duì)象,我們可以利用 AWS SDK for Java 提供的 S3Client 類(lèi)。
首先,讓我們創(chuàng)建一個(gè)新的 Java 項(xiàng)目并將以下 Maven 依賴(lài)項(xiàng)添加到 pom.xml 文件中:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.21.0</version>
</dependency>
對(duì)于本文中的示例,我們將使用版本 2.21.0。要查看最新版本,我們可以檢查 Maven Repository。
我們還需要設(shè)置一個(gè) AWS 賬戶(hù),安裝 AWS CLI ,并使用我們的 AWS 憑證( AWS_ACCESS_KEY_ID和AWS_SECERET_ACCESS_KEY )對(duì)其進(jìn)行配置,以便能夠以編程方式訪問(wèn) AWS 資源。我們可以在AWS 文檔中找到完成此操作的所有步驟。
最后,我們需要?jiǎng)?chuàng)建一個(gè) AWS S3 存儲(chǔ)桶并上傳一些文件。如下圖所示,對(duì)于我們的示例,我們創(chuàng)建了一個(gè)名為 baeldung-tutorials-s3 的存儲(chǔ)桶并向其中上傳了一些測(cè)試文件:
三、列出 S3 存儲(chǔ)桶中的對(duì)象
讓我們使用適用于 Java V2 的 AWS 開(kāi)發(fā)工具包并創(chuàng)建一個(gè)從存儲(chǔ)桶讀取對(duì)象的方法:
String AWS_BUCKET = "baeldung-tutorial-s3";
Region AWS_REGION = Region.EU_CENTRAL_1;
void listObjectsInBucket() {
S3Client s3Client = S3Client.builder()
.region(AWS_REGION)
.build();
ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder()
.bucket(AWS_BUCKET)
.build();
ListObjectsV2Response listObjectsV2Response = s3Client.listObjectsV2(listObjectsV2Request);
List<S3Object> contents = listObjectsV2Response.contents();
System.out.println("Number of objects in the bucket: " + contents.stream().count());
contents.stream().forEach(System.out::println);
s3Client.close();
}
要列出 AWS S3 存儲(chǔ)桶中的對(duì)象,我們首先需要?jiǎng)?chuàng)建一個(gè)ListObjectsV2Request實(shí)例,并指定存儲(chǔ)桶名稱(chēng)。然后,我們?cè)?s3Client 對(duì)象上調(diào)用 listObjectsV2 方法,并將請(qǐng)求作為參數(shù)傳遞。該方法返回一個(gè) ListObjectsV2Response,其中包含桶中對(duì)象的信息。
最后,我們使用contents()
方法訪問(wèn) S3 對(duì)象列表并將檢索到的對(duì)象數(shù)量寫(xiě)入作為輸出。我們還為存儲(chǔ)桶名稱(chēng)和相應(yīng)的 AWS 區(qū)域定義了兩個(gè)靜態(tài)屬性。
執(zhí)行該方法后,我們得到以下結(jié)果:
Number of objects in the bucket: 1000
S3Object(Key=file_0.txt, LastModified=2023-11-01T11:35:06Z, ETag="b9ece18c950afbfa6b0fdbfa4ff731d3", Size=1, StorageClass=STANDARD)
S3Object(Key=file_1.txt, LastModified=2023-11-01T11:35:07Z, ETag="97a6dd4c45b23db9c5d603ce161b8cab", Size=1, StorageClass=STANDARD)
S3Object(Key=file_10.txt, LastModified=2023-11-01T11:35:07Z, ETag="3406877694691ddd1dfb0aca54681407", Size=1, StorageClass=STANDARD)
S3Object(Key=file_100.txt, LastModified=2023-11-01T11:35:15Z, ETag="b99834bc19bbad24580b3adfa04fb947", Size=1, StorageClass=STANDARD)
S3Object(Key=file_1000.txt, LastModified=2023-08-01T18:54:31Z, ETag="47ed733b8d10be225eceba344d533586", Size=1, StorageClass=STANDARD)
[...]
正如我們所看到的,我們并沒(méi)有得到所有上傳的對(duì)象。
值得注意的是,該解決方案設(shè)計(jì)為僅返回最多 1000 個(gè)對(duì)象。如果存儲(chǔ)桶包含超過(guò) 1000 個(gè)對(duì)象,我們必須使用ListObjectsV2Response對(duì)象中的nextContinuationToken()
方法實(shí)現(xiàn)分頁(yè)。
四、使用延續(xù)標(biāo)記進(jìn)行分頁(yè)
如果我們的 AWS S3 存儲(chǔ)桶包含超過(guò) 1000 個(gè)對(duì)象,我們需要使用nextContinuationToken()
方法實(shí)現(xiàn)分頁(yè)。
讓我們看一個(gè)示例,演示如何處理這種情況:
void listAllObjectsInBucket() {
S3Client s3Client = S3Client.builder()
.region(AWS_REGION)
.build();
String nextContinuationToken = null;
long totalObjects = 0;
do {
ListObjectsV2Request.Builder requestBuilder = ListObjectsV2Request.builder()
.bucket(AWS_BUCKET)
.continuationToken(nextContinuationToken);
ListObjectsV2Response response = s3Client.listObjectsV2(requestBuilder.build());
nextContinuationToken = response.nextContinuationToken();
totalObjects += response.contents().stream()
.peek(System.out::println)
.reduce(0, (subtotal, element) -> subtotal + 1, Integer::sum);
} while (nextContinuationToken != null);
System.out.println("Number of objects in the bucket: " + totalObjects);
s3Client.close();
}
在這里,我們使用do-while
循環(huán)對(duì)存儲(chǔ)桶中的所有對(duì)象進(jìn)行分頁(yè)。循環(huán)繼續(xù),直到不再有繼續(xù)標(biāo)記,這表明我們檢索了所有對(duì)象。
因此,我們得到以下輸出:
Number of objects in the bucket: 1060
使用這種方法,我們顯式地管理分頁(yè)。我們檢查是否存在繼續(xù)令牌并在以下請(qǐng)求中使用它。這使我們能夠完全控制何時(shí)以及如何請(qǐng)求下一頁(yè)。它允許在處理分頁(yè)過(guò)程時(shí)具有更大的靈活性。
默認(rèn)情況下,響應(yīng)中返回的最大對(duì)象數(shù)為 1000。它可能包含更少的鍵,但永遠(yuǎn)不會(huì)包含更多。我們可以通過(guò)ListObjectsV2Reqeust的 maxKeys()
方法更改此設(shè)置。
五、使用 ListObjectsV2Iterable 進(jìn)行分頁(yè)
我們可以使用 AWS SDK 通過(guò) ListObjectsV2Iterable 類(lèi)和 listObjectsV2Paginator()
方法來(lái)處理分頁(yè)。這簡(jiǎn)化了代碼,因?yàn)槲覀儾恍枰謩?dòng)管理分頁(yè)過(guò)程。這使得代碼更加簡(jiǎn)潔和可讀,從而更容易維護(hù)。
實(shí)現(xiàn)的代碼如下:
void listAllObjectsInBucketPaginated(int pageSize) {
S3Client s3Client = S3Client.builder()
.region(AWS_REGION)
.build();
ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder()
.bucket(AWS_BUCKET )
.maxKeys(pageSize) // Set the maxKeys parameter to control the page size
.build();
ListObjectsV2Iterable listObjectsV2Iterable = s3Client.listObjectsV2Paginator(listObjectsV2Request);
long totalObjects = 0;
for (ListObjectsV2Response page : listObjectsV2Iterable) {
long retrievedPageSize = page.contents().stream()
.peek(System.out::println)
.reduce(0, (subtotal, element) -> subtotal + 1, Integer::sum);
totalObjects += retrievedPageSize;
System.out.println("Page size: " + retrievedPageSize);
}
System.out.println("Total objects in the bucket: " + totalObjects);
s3Client.close()
}
這是當(dāng)我們調(diào)用 pageSize 為 500 的方法時(shí)得到的輸出:
S3Object(Key=file_0.txt, LastModified=2023-08-01T11:35:06Z, ETag="b9ece18c950afbfa6b0fdbfa4ff731d3", Size=1, StorageClass=STANDARD)
S3Object(Key=file_1.txt, LastModified=2023-08-01T11:35:07Z, ETag="97a6dd4c45b23db9c5d603ce161b8cab", Size=1, StorageClass=STANDARD)
S3Object(Key=file_10.txt, LastModified=2023-08-01T11:35:07Z, ETag="3406877694691ddd1dfb0aca54681407", Size=1, StorageClass=STANDARD)
[..]
S3Object(Key=file_494.txt, LastModified=2023-11-01T18:53:56Z, ETag="69b7a7308ee1b065aa308e63c44ae0f3", Size=1, StorageClass=STANDARD)
Page size: 500
S3Object(Key=file_495.txt, LastModified=2023-11-01T18:53:57Z, ETag="83acb6e67e50e31db6ed341dd2de1595", Size=1, StorageClass=STANDARD)
S3Object(Key=file_496.txt, LastModified=2023-11-01T18:53:57Z, ETag="3beb9cf0eab8cbf2215990b4a6bdc271", Size=1, StorageClass=STANDARD)
S3Object(Key=file_497.txt, LastModified=2023-11-01T18:53:57Z, ETag="69691c7bdcc3ce6d5d8a1361f22d04ac", Size=1, StorageClass=STANDARD)
[..]
S3Object(Key=file_944.txt, LastModified=2023-11-01T18:54:27Z, ETag="f623e75af30e62bbd73d6df5b50bb7b5", Size=1, StorageClass=STANDARD)
Page size: 500
S3Object(Key=file_945.txt, LastModified=2023-11-01T18:54:27Z, ETag="55a54008ad1ba589aa210d2629c1df41", Size=1, StorageClass=STANDARD)
S3Object(Key=file_946.txt, LastModified=2023-11-01T18:54:27Z, ETag="ade7a0dcf4ddc0673ed48b70a4a340d6", Size=1, StorageClass=STANDARD)
S3Object(Key=file_947.txt, LastModified=2023-11-01T18:54:27Z, ETag="0a476d83ef9cef4bce7f9025522be3b5", Size=1, StorageClass=STANDARD)
[..]
S3Object(Key=file_999.txt, LastModified=2023-11-01T18:54:31Z, ETag="5e732a1878be2342dbfeff5fe3ca5aa3", Size=1, StorageClass=STANDARD)
Page size: 60
Total objects in the bucket: 1060
當(dāng)我們?cè)?for 循環(huán)中迭代頁(yè)面時(shí),AWS 開(kāi)發(fā)工具包通過(guò)檢索下一頁(yè)來(lái)延遲分頁(yè)。僅當(dāng)我們到達(dá)當(dāng)前頁(yè)面的末尾時(shí),它才會(huì)獲取下一頁(yè),這意味著頁(yè)面是按需加載的,而不是一次性加載的。
六、使用前綴列出對(duì)象
在某些情況下,我們只想列出具有公共前綴的對(duì)象,例如,所有以backup
開(kāi)頭的對(duì)象。
為了展示此用例,我們將名為 backup1.txt 的文件上傳到存儲(chǔ)桶,創(chuàng)建一個(gè)名為 backup 的文件夾并將六個(gè)文件移入其中。該存儲(chǔ)桶現(xiàn)在總共包含七個(gè)對(duì)象。
這就是我們的存儲(chǔ)桶的樣子,圖下圖:
接下來(lái)更改函數(shù)以?xún)H返回具有公共前綴的對(duì)象:
void listAllObjectsInBucketPaginatedWithPrefix(int pageSize, String prefix) {
S3Client s3Client = S3Client.builder()
.region(AWS_REGION)
.build();
ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder()
.bucket(AWS_BUCKET)
.maxKeys(pageSize) // Set the maxKeys parameter to control the page size
.prefix(prefix) // Set the prefix
.build();
ListObjectsV2Iterable listObjectsV2Iterable = s3Client.listObjectsV2Paginator(listObjectsV2Request);
long totalObjects = 0;
for (ListObjectsV2Response page : listObjectsV2Iterable) {
long retrievedPageSize = page.contents().stream().count();
totalObjects += retrievedPageSize;
System.out.println("Page size: " + retrievedPageSize);
}
System.out.println("Total objects in the bucket: " + totalObjects);
s3Client.close();
}
我們只需調(diào)用 ListObjectsV2Request 上的 前綴方法即可。如果我們調(diào)用前綴參數(shù)設(shè)置為backup
的函數(shù),它將統(tǒng)計(jì)存儲(chǔ)桶中以backup
開(kāi)頭的所有對(duì)象。
“backup1.txt” 和 “backup/file1.txt” 這兩個(gè)鍵都將匹配:
listAllObjectsInBucketPaginatedWithPrefix(10, "backup");
這是我們返回的結(jié)果:
S3Object(Key=backup/, LastModified=2023-11-01T17:47:33Z, ETag="d41d8cd98f00b204e9800998ecf8427e", Size=0, StorageClass=STANDARD)
S3Object(Key=backup/file_0.txt, LastModified=2023-11-01T17:48:13Z, ETag="a87ff679a2f3e71d9181a67b7542122c", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_1.txt, LastModified=2023-11-01T17:48:13Z, ETag="9eecb7db59d16c80417c72d1e1f4fbf1", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_2.txt, LastModified=2023-11-01T17:48:13Z, ETag="800618943025315f869e4e1f09471012", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_3.txt, LastModified=2023-11-01T17:48:13Z, ETag="8666683506aacd900bbd5a74ac4edf68", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_4.txt, LastModified=2023-11-01T17:49:05Z, ETag="f95b70fdc3088560732a5ac135644506", Size=1, StorageClass=STANDARD)
S3Object(Key=backup1.txt, LastModified=2023-05-04T13:29:23Z, ETag="ec631d7335abecd318f09f56515ed63c", Size=1, StorageClass=STANDARD)
Page size: 7
Total objects in the bucket: 7
如果我們不想統(tǒng)計(jì)桶正下方的對(duì)象,我們需要在前綴后面添加一個(gè)斜杠:
listAllObjectsInBucketPaginatedWithPrefix(10, "backup/");
現(xiàn)在我們只獲取bucket/
文件夾中的對(duì)象:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-742234.html
S3Object(Key=backup/, LastModified=2023-11-01T17:47:33Z, ETag="d41d8cd98f00b204e9800998ecf8427e", Size=0, StorageClass=STANDARD)
S3Object(Key=backup/file_0.txt, LastModified=2023-11-01T17:48:13Z, ETag="a87ff679a2f3e71d9181a67b7542122c", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_1.txt, LastModified=2023-11-01T17:48:13Z, ETag="9eecb7db59d16c80417c72d1e1f4fbf1", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_2.txt, LastModified=2023-11-01T17:48:13Z, ETag="800618943025315f869e4e1f09471012", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_3.txt, LastModified=2023-11-01T17:48:13Z, ETag="8666683506aacd900bbd5a74ac4edf68", Size=1, StorageClass=STANDARD)
S3Object(Key=backup/file_4.txt, LastModified=2023-11-01T17:49:05Z, ETag="f95b70fdc3088560732a5ac135644506", Size=1, StorageClass=STANDARD)
Page size: 6
Total objects in the bucket: 6
七、文末總結(jié)
本文介紹了如何在 AWS S3 存儲(chǔ)桶中列出對(duì)象的不同方法,包括使用延續(xù)標(biāo)記進(jìn)行分頁(yè)、使用 ListObjectsV2Iterable 進(jìn)行分頁(yè)以及使用前綴進(jìn)行對(duì)象的列出。通過(guò)這些方法,你可以更有效地管理 S3 存儲(chǔ)桶中的對(duì)象,實(shí)現(xiàn)更高效的數(shù)據(jù)檢索和管理。前期準(zhǔn)備和基礎(chǔ)知識(shí)也在文章中提到,幫助讀者更好地理解和運(yùn)用這些方法。希望這些信息對(duì)您在 AWS S3 存儲(chǔ)桶中的對(duì)象管理工作中有所幫助。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742234.html
[ 本文作者 ] bluetata
[ 原文鏈接 ] https://bluetata.blog.csdn.net/article/details/134174962
[ 最后更新 ] 11/01/2023 2:31
[ 版權(quán)聲明 ] 如果您在非 CSDN 網(wǎng)站內(nèi)看到這一行,
說(shuō)明網(wǎng)絡(luò)爬蟲(chóng)可能在本人還沒(méi)有完整發(fā)布的時(shí)候就抓走了我的文章,
可能導(dǎo)致內(nèi)容不完整,請(qǐng)去上述的原文鏈接查看原文。
到了這里,關(guān)于[ 云計(jì)算 | AWS 實(shí)踐 ] 使用 Java 列出存儲(chǔ)桶中的所有 AWS S3 對(duì)象的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!