在 Amazon S3 对象上执行操作 - Amazon SDK for Java 1.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

我们宣布了即将推出 end-of-support 的 Amazon SDK for Java (v1)。建议您迁移到 Amazon SDK for Java v2。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon S3 对象上执行操作

Amazon S3 对象表示一个文件 或数据集合。每个对象必须驻留在一个存储桶中。

注意

这些代码示例假定您了解使用Amazon SDK for Java 中的内容,并且已使用设置用于开发的 Amazon 凭证和区域中的信息配置默认 Amazon 凭证。

上传对象

使用 AmazonS3 客户端的 putObject 方法,并为其提供桶名称、键名称和要上传的文件。存储桶必须存在,否则将出现错误

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3;

代码

System.out.format("Uploading %s to S3 bucket %s...\n", file_path, bucket_name); final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { s3.putObject(bucket_name, key_name, new File(file_path)); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例

列出对象

要获取桶中的对象列表,请使用 AmazonS3 客户端的 listObjects 方法,并为其提供桶名称。

listObjects 方法返回一个 ObjectListing 对象,该对象提供有关存储桶中对象的信息。要列出对象名称(键),可使用 getObjectSummaries 方法获取 S3ObjectSummary 对象的列表,其中每个对象均表示存储桶中的一个对象。然后调用其 getKey 方法以检索对象名称。

导入

import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3ObjectSummary;

代码

System.out.format("Objects in S3 bucket %s:\n", bucket_name); final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); ListObjectsV2Result result = s3.listObjectsV2(bucket_name); List<S3ObjectSummary> objects = result.getObjectSummaries(); for (S3ObjectSummary os : objects) { System.out.println("* " + os.getKey()); }

请参阅 GitHub 上的完整示例

下载对象

使用 AmazonS3 客户端的 getObject 方法,并向其传递要下载的桶和对象的名称。如果成功,此方法将返回一个 S3Object指定的存储桶和对象键必须存在,否则将出现错误

您可以通过对 getObjectContent 调用 S3Object 来获取对象的内容。这将返回一个 S3ObjectInputStream,其行为与标准 Java InputStream 对象的相同。

以下示例从 S3 下载一个对象,然后将该对象的内容保存到一个文件(使用与对象键相同的名称):

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; import java.io.File;

代码

System.out.format("Downloading %s from S3 bucket %s...\n", key_name, bucket_name); final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { S3Object o = s3.getObject(bucket_name, key_name); S3ObjectInputStream s3is = o.getObjectContent(); FileOutputStream fos = new FileOutputStream(new File(key_name)); byte[] read_buf = new byte[1024]; int read_len = 0; while ((read_len = s3is.read(read_buf)) > 0) { fos.write(read_buf, 0, read_len); } s3is.close(); fos.close(); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); System.exit(1); } catch (IOException e) { System.err.println(e.getMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例

复制、移动或重命名对象

您可以使用 AmazonS3 客户端的 copyObject 方法将对象从一个桶复制到另一个桶。它采用要从中复制的存储桶的名称、要复制的对象以及目标存储桶名称。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions;

代码

try { s3.copyObject(from_bucket, object_key, to_bucket, object_key); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } System.out.println("Done!");

请参阅 GitHub 上的完整示例

注意

您可以将 copyObjectdeleteObject 配合使用来移动重命名对象,方式是先将对象复制到新名称 (您可以使用与源和目标相同的存储桶),然后从对象的旧位置删除对象。

删除对象

使用 AmazonS3 客户端的 deleteObject 方法,并向其传递要删除的桶和对象的名称。指定的存储桶和对象键必须存在,否则将出现错误

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions;

代码

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { s3.deleteObject(bucket_name, object_key); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例

一次性删除多个对象

使用 AmazonS3 客户端 deleteObjects 的方法,您可以将同一个桶中的多个对象的名称传递给 link:sdk-for-java/v1/reference/com/amazonaws/services/s3/model/DeleteObjectsRequest.html 方法,从而删除这些对象。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3;

代码

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { DeleteObjectsRequest dor = new DeleteObjectsRequest(bucket_name) .withKeys(object_keys); s3.deleteObjects(dor); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例