大安的回答 https://stackoverflow.com/a/9429242/45773 using GET 存储桶(列表对象) http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html(通过相应的包装器适用于 Java 的 AWS http://aws.amazon.com/sdkforjava/,见下文)是一次获取许多对象所需信息的最有效方法(+1),当然,您需要对响应进行相应的后期处理。
这可以通过以下方法之一最轻松地完成:类 AmazonS3Client http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html, e.g. listObjects(字符串存储桶名称) http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#listObjects%28java.lang.String%29:
AmazonS3 s3 = new AmazonS3Client(); // provide credentials, if need be
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
.withBucketName("cdn.generalsentiment.com");
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
选择
如果您一次只对单个对象(文件)感兴趣,请使用头对象 http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectHEAD.html将会更加高效,因为您可以直接从相应的 HTTP 响应代码推断存在性(请参阅错误响应的详细信息 http://docs.amazonwebservices.com/AmazonS3/latest/API/ErrorResponses.html), i.e. 404 未找到 http://en.wikipedia.org/wiki/HTTP_404的回应NoSuchKey - 指定的键不存在.
同样,这最容易通过类 AmazonS3Client http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html,即getObjectMetadata(字符串存储桶名称, 字符串键) http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObjectMetadata%28java.lang.String,%20java.lang.String%29, e.g.:
public static boolean isValidFile(AmazonS3 s3,
String bucketName,
String path) throws AmazonClientException, AmazonServiceException {
boolean isValidFile = true;
try {
ObjectMetadata objectMetadata = s3.getObjectMetadata(bucketName, path);
} catch (AmazonS3Exception s3e) {
if (s3e.getStatusCode() == 404) {
// i.e. 404: NoSuchKey - The specified key does not exist
isValidFile = false;
}
else {
throw s3e; // rethrow all S3 exceptions other than 404
}
}
return isValidFile;
}