Amazon Simple Storage Service (Amazon S3)是面向 Internet 的存储服务,具有高扩展性、可靠性、安全性和快速价廉的特点,提供 99.999999999% 的持久性,可存储无限量的数据,每个对象最多包含 5 TB 的数据。S3支持版本控制、对象生命周期管理、加密、静态网站托管、Select SQL查询等。

S3 JAVA SDK

S3 架构设计与编程语言无关,提供 REST 和 SOAP 接口。HTTP 上的 SOAP 支持已弃用,但仍可在 HTTPS 上使用。SOAP 将不支持新 S3 功能,建议使用 REST API。

借助 REST,可以使用标准的 HTTP 请求创建、提取和删除存储桶和对象。直接利用REST API进行代码开发是复杂的,AWS SDK包装了底层REST API,可以简化编程任务。

配置AWS Credentials

为使用AWS SDK,必须提供AWS凭证,在 ~/.aws/credentials (Windows 用户为 C:\Users\USER_NAME.aws\credentials) 中创建:

[default]

aws_access_key_id = your_access_key_id

aws_secret_access_key = your_secret_access_key

POM

UTF-8

com.amazonaws

aws-java-sdk-s3

com.amazonaws

aws-java-sdk-bom

1.11.433

pom

import

如要使用全部的SDK,不需使用BOM,简单声明如下:

com.amazonaws

aws-java-sdk

1.11.433

S3基本操作

演示了createBucket、listBuckets、putObject、getObject、listObjects、deleteObject、deleteBucket等S3基本操作。

package org.itrunner.aws.s3;

import com.amazonaws.HttpMethod;

import com.amazonaws.regions.Regions;

import com.amazonaws.services.s3.AmazonS3;

import com.amazonaws.services.s3.AmazonS3ClientBuilder;

import com.amazonaws.services.s3.model.*;

import java.io.File;

import java.net.URL;

import java.util.Date;

import java.util.List;

public class S3Util {

private static AmazonS3 s3;

static {

s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.CN_NORTH_1).build();

}

private S3Util() {

}

/*

* Create a new S3 bucket - Amazon S3 bucket names are globally unique

*/

public static Bucket createBucket(String bucketName) {

return s3.createBucket(bucketName);

}

/*

* List the buckets in your account

*/

public static List listBuckets() {

return s3.listBuckets();

}

/*

* List objects in your bucket

*/

public static ObjectListing listObjects(String bucketName) {

return s3.listObjects(bucketName);

}

/*

* List objects in your bucket by prefix

*/

public static ObjectListing listObjects(String bucketName, String prefix) {

return s3.listObjects(bucketName, prefix);

}

/*

* Upload an object to your bucket

*/

public static PutObjectResult putObject(String bucketName, String key, File file) {

return s3.putObject(bucketName, key, file);

}

/*

* Download an object - When you download an object, you get all of the object's metadata and a stream from which to read the contents.

* It's important to read the contents of the stream as quickly as possibly since the data is streamed directly from Amazon S3 and your

* network connection will remain open until you read all the data or close the input stream.

*/

public static S3Object get(String bucketName, String key) {

return s3.getObject(bucketName, key);

}

/*

* Delete an object - Unless versioning has been turned on for your bucket, there is no way to undelete an object, so use caution when deleting objects.

*/

public static void deleteObject(String bucketName, String key) {

s3.deleteObject(bucketName, key);

}

/*

* Delete a bucket - A bucket must be completely empty before it can be deleted, so remember to delete any objects from your buckets before

* you try to delete them.

*/

public static void deleteBucket(String bucketName) {

s3.deleteBucket(bucketName);

}

}

生成预签名URL

默认,S3对象为私有,只有所有者具有访问权限。但是,对象所有者可以使用自己的安全凭证来创建预签名的URL,授予有限时间内的对象下载许可,从而与其他用户共享对象,收到预签名URL的任何人都可以访问对象。

当创建预签名URL时,必须提供安全凭证、存储桶名称和对象键、HTTP 方法 (指定为GET来下载对象) 和过期时间。

public String generatePresignedUrl(String bucketName, String key, int minutes) {

// Sets the expiration date

Date expiration = new Date();

long expTimeMillis = expiration.getTime();

expTimeMillis += 1000 * 60 * minutes;

expiration.setTime(expTimeMillis);

// Generate the presigned URL.

GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key).withMethod(HttpMethod.GET).withExpiration(expiration);

URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);

return url.toString();

}

从对象中选择内容

利用Amazon S3 Select,可以使用SQL语句筛选 S3 对象的内容,检索所需的部分数据。Amazon S3 Select 适用于以CSV或JSON格式存储的对象,这些对象可以通过GZIP或BZIP2压缩和服务器端加密。

S3 Select的要求和限制

要求:

必须拥有所查询的对象的 s3:GetObject 权限。

如果查询的对象已进行加密,则必须使用 https,并必须在请求中提供加密密钥。

限制:

SQL 表达式的最大长度为 256 KB。

结果中记录的最大长度为 1 MB。

SQL语法

Amazon S3 Select 支持部分SQL,语法如下:

SELECT column_name FROM table_name [WHERE condition] [LIMIT number]

其中table_name为S3Object。

SELECT子句支持*。

文件格式为CSV时,引用列可以使用列编号或列名,列编号从1开始:

select s._1 from S3Object s

Select s.name from S3Object s

使用列名时,程序中必须设置FileHeaderInfo为Use。

可以使用双引号指示列名区分大小写:

SELECT s."name" from S3Object s

不使用双引号列名不区分大小写。

比如,CSV文件内容如下:

username,email

Jason,jason@163.com

Coco,coco@163.com

SQL语句可以为:

select s.email from S3Object s where s.username='Jason'

查询CSV文件

以下示例将查询结果保存在outputPath文件中:

public static void selectCsvObjectContent(String bucketName, String csvObjectKey, String sql, String outputPath) throws Exception {

SelectObjectContentRequest request = generateBaseCSVRequest(bucketName, csvObjectKey, sql);

final AtomicBoolean isResultComplete = new AtomicBoolean(false);

try (OutputStream fileOutputStream = new FileOutputStream(new File(outputPath));

SelectObjectContentResult result = s3.selectObjectContent(request)) {

InputStream resultInputStream = result.getPayload().getRecordsInputStream(

new SelectObjectContentEventVisitor() {

/*

* An End Event informs that the request has finished successfully.

*/

@Override

public void visit(SelectObjectContentEvent.EndEvent event) {

isResultComplete.set(true);

}

}

);

copy(resultInputStream, fileOutputStream);

}

/*

* The End Event indicates all matching records have been transmitted. If the End Event is not received, the results may be incomplete.

*/

if (!isResultComplete.get()) {

throw new Exception("S3 Select request was incomplete as End Event was not received.");

}

}

private static SelectObjectContentRequest generateBaseCSVRequest(String bucket, String key, String query) {

SelectObjectContentRequest request = new SelectObjectContentRequest();

request.setBucketName(bucket);

request.setKey(key);

request.setExpression(query);

request.setExpressionType(ExpressionType.SQL);

InputSerialization inputSerialization = new InputSerialization();

CSVInput csvInput = new CSVInput();

csvInput.setFileHeaderInfo(FileHeaderInfo.USE);

inputSerialization.setCsv(csvInput);

inputSerialization.setCompressionType(CompressionType.NONE);

request.setInputSerialization(inputSerialization);

OutputSerialization outputSerialization = new OutputSerialization();

outputSerialization.setCsv(new CSVOutput());

request.setOutputSerialization(outputSerialization);

return request;

}

参考文档

java aws_AWS学习笔记(八)--S3 JAVA SDK相关推荐

  1. Java入门学习笔记[狂神说Java]

    写在前面: 本文根据B站狂神说Java 与菜鸟教程 整理而来,仅供个人学习使用,如有侵权,请联系删除. 文章目录 IDEA使用 Java基础01:注释 Java基础02:数据类型 Java基础03:类 ...

  2. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. [原创]java WEB学习笔记35:java WEB 中关于绝对路径 和相对路径问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. Java安全学习笔记(八)-使用加盐技术防范字典式攻击

    口令被轻松攻击的主要原因在于口令过短或者过于简单.如果口令很长,则计算所有组合的消息摘要可能要成百上千年,这将大大加大了生成字典的难度.同时口令过长也会给用户带来不便记忆的麻烦,因此用户使用的口令长度 ...

  6. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  7. 尚学堂JAVA高级学习笔记_1/2

    尚学堂JAVA高级学习笔记 文章目录 尚学堂JAVA高级学习笔记 写在前面 第1章 手写webserver 1. 灵魂反射 2. 高效解析xml 3. 解析webxml 4. 反射webxml 5. ...

  8. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  9. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

最新文章

  1. SpringJDBC的简单应用
  2. 第五个页面:更多电影页面
  3. 计算机操作系统开启审计功能,深入浅出理解操作系统安全
  4. python 利用pyttsx3文字转语音
  5. 【转】Java开发必须要知道的知识体系
  6. ssl1341-Asteroids【最大匹配,最小点覆盖,图论】
  7. 汇编语言(十四)之判断字符串是否包含数字
  8. MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
  9. python读取音频文件_python 读取wav 音频文件的两种方式
  10. ncurses窗口机制:newwin(),wprintw(),delwin(),box(),wborder(),
  11. 在Github上搭建你的博客
  12. Protocol Buffers C++ 入门教程
  13. 网络连接正常,IE不能打开网页的全面解决方法
  14. ArduinoUNO实战-第七章-PWM调光
  15. 关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决
  16. PS制作搞笑印章 - 仿真印章 - 水印滤色
  17. VM安装win7系统一直失败,可能是镜像文件不对
  18. linux压缩文件命令_24.gzip、unzip命令详解 - 钟桂耀
  19. 宇视摄像头安装水晶头防护套步骤
  20. 大数据分析的方法有几种?

热门文章

  1. RTMP流媒体直播资料
  2. 一般将来时语法课教案_英语时态
  3. SpringBoot的Cacheable缓存入门
  4. 购买虚拟服务器费用入什么科目,购买的云服务器费用入什么科目
  5. 大学c语言程序设计听不懂,C语言听不懂?那你还不点进来看看?
  6. SCCM部署系统任务序列失败错误代码0x80070002
  7. Python3 ——斐波那契数列(经典)
  8. python 魔法方法(2)
  9. Python练习题10:斐波那契数列计算
  10. Python编程零基础如何逆袭成为爬虫实战高手