m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

AWSのSESでメール送信

SESはメール送信のサービスだった

忘れてた…
受信できるように設定できる以上、送信できるはず…

やること

  • SES用のアクセスキーを生成
  • メール送信制限を解除
  • リージョンを指定

実装

Sample01.java
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient;
import com.amazonaws.services.simpleemail.model.Body;
import com.amazonaws.services.simpleemail.model.Content;
import com.amazonaws.services.simpleemail.model.Destination;
import com.amazonaws.services.simpleemail.model.Message;
import com.amazonaws.services.simpleemail.model.SendEmailRequest;

public class Sample01 {
	
	private static final String ACCESS_KEY = "アクセスキー";
	private static final String SECRET_ACCESS_KEY = "シークレットアクセスキー";
	
	public static void main(String[] args) {
		
		String TO = "送信先のメールアドレス";
		String FROM = "SESで認証したメールアドレス";
		String SUBJECT = "テストメール";
		String BODY = "テストメールです。";
		
		// 宛先
		Destination destination = new Destination().withToAddresses(new String[]{TO});
	    // 件名
	    Content subject = new Content().withData(SUBJECT);
		// 本文
	    Body body = new Body().withText(new Content().withData(BODY));
	    
	    // メッセージ
	    Message message = new Message()
	        .withSubject(subject)
	        .withBody(body);
	    
	    // リクエストを作成
	    SendEmailRequest request = new SendEmailRequest()
	        .withSource(FROM)
	        .withDestination(destination)
	        .withMessage(message);

	    // 認証
	    AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient(
	    		new  BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY));
	    
	    // リージョンを設定
	    client.setRegion(Region.getRegion(Regions.US_WEST_2));
	    
	    // メール送信
	    client.sendEmail(request);
		
	}

}

リージョンで送信できない場合がある

送信解除をしても対象のリージョンを指定していない場合は送信できないかも…

Exception in thread "main" com.amazonaws.services.simpleemail.model.MessageRejectedException: Email address is not verified. The following identities failed the check in region US-EAST-1: 送信先のメールアドレス,解除したメールアドレス (Service: AmazonSimpleEmailService; Status Code: 400; Error Code: MessageRejected; Request ID: f61b711c-da49-11e6-b2e2-ff93b2bc0127)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1586)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1254)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1035)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:747)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:721)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:704)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:672)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:654)
	at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:518)
	at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.doInvoke(AmazonSimpleEmailServiceClient.java:3340)
	at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.invoke(AmazonSimpleEmailServiceClient.java:3316)
	at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.sendEmail(AmazonSimpleEmailServiceClient.java:2345)
	at Sample01.main(Sample01.java:50)

ちょっとむずかしいね

(´・ω・`)

Javaで2つの期間より差を検出する。

2つの日時より日数を取得したい

ので簡単なやつを調査

年月日、時分秒の差を取得するサンプル

Sample02.java
package sample02;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Sample02 {
	
	static final String FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
	
	public static void main(String[] args) {
		// 2つのLocalDateTime
		LocalDateTime dt1;
		LocalDateTime dt2;
		
		dt1 = parse("2017-12-10 09:10:30.432");
		dt2 = parse("2022-03-16 12:45:12.102");
		
		System.out.println("期間:" + dt1 + "〜" + dt2);
		System.out.println();
		
		// 日数計算
		long localDiffDays1 = ChronoUnit.DAYS.between(dt1, dt2);
		System.out.println("日数:" + localDiffDays1);
		
		// 月数計算
		long localDiffDays2 = ChronoUnit.MONTHS.between(dt1, dt2);
		System.out.println("月数:" + localDiffDays2);
		
		// 年数計算
		long localDiffDays3 = ChronoUnit.YEARS.between(dt1, dt2);
		System.out.println("年数:" + localDiffDays3);
		
		// 秒計算
		long localDiffDays4 = ChronoUnit.SECONDS.between(dt1, dt2);
		System.out.println("秒 :" + localDiffDays4);
		
		// 分計算
		long localDiffDays5 = ChronoUnit.MINUTES.between(dt1, dt2);
		System.out.println("分 :" + localDiffDays5);
		
		// 時間計算
		long localDiffDays6 = ChronoUnit.HOURS.between(dt1, dt2);
		System.out.println("時 :" + localDiffDays6);
	}
	
	public static LocalDateTime parse(String date) {
		return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(FORMAT));
	}
	
}

期間:2017-12-10T09:10:30.432〜2022-03-16T12:45:12.102

日数:1557
月数:51
年数:4
秒 :134537681
分 :2242294
時 :37371

ChronoUnit

こいつでそれぞれのデータ型に合わせてLocalDateTimeのデータを設定することで2つの日時の差を取得できるようです。
結構シンプル(^^)

参考

Javaで日時を扱う(Java8) - Qiita

今回はここまで

Javaで暗号化処理

なんか一括でやるのないの?

ライブラリとしてはありそうですけどJava共通ではなさそう

参考資料

qiita.com
基本↑見て

やりたいこと

指定の文字列にソルト文字列とかを設定して変な文字列にしたい…

実装

Sample01.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

public class Sample01 {
	
//	private static final String ALGORITHM = "SHA-256";
//	private static final String ALGORITHM = "SHA-384";
	private static final String ALGORITHM = "MD5";
	
	public static void main(String[] args) {
		
		for(int i=0;i<10;i++) {
			String res = null;
			String id = UUID.randomUUID().toString();
			DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
			String time = String.valueOf(LocalDateTime.now().format(f));
			String value = id + time;
			
			//
			res = value + " -> " + hashValue(value);
			System.out.println(res);
		}

	}
	
	public static String hashValue(String id) {
		String res = null;
		StringBuilder sb = null;
		
		try {
			MessageDigest md = MessageDigest.getInstance(ALGORITHM);
			md.update(id.getBytes());
			sb = new StringBuilder();
		    for (byte b : md.digest()) {
		        String hex = String.format("%02x", b);
		        sb.append(hex);
		    }
		    res = sb.toString();
		    
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		return res;
	}

}

e1242272-9bf8-442d-8117-9e3ad4b3647720170111232904271 -> 521ef152cb07f806660753e403095556
c30a9dfa-e253-4972-b3aa-4a76b6471faa20170111232904288 -> c0463468c4615db586e57a1453b3c1fe
a2f03642-2ac3-4b37-b02a-fd0722224abc20170111232904289 -> 0a6a0cfafed084796377e6047884422e
411000d1-b143-4742-bf05-6531ba1c16a520170111232904291 -> 1e21f51ec30dc0d8f17f17018b87855b
fbac2ec4-8502-48b7-a551-20209346272120170111232904292 -> f34c894ee82d26761773b7be4e32e3e8
cf5c4f1c-d3f3-4648-aaf6-7cbeb1cdbe5720170111232904293 -> 38ad47a89b2f9407fee73605245a85ac
0656800a-1ec1-4ba7-9260-195a769d620820170111232904294 -> 1ce74a1b8862d761d538ec280b8adac3
1f9c7c16-58ad-4991-8ba8-f9fa3d0564ca20170111232904295 -> d0b63e2b96bbfedf16d41aa3142261ba
05f11ff3-be44-4a76-ad46-31534d466e9f20170111232904296 -> 62beae12ce3b618c842971995c4737d0
06534f7f-c6e1-4c52-be91-233bb6477c2320170111232904297 -> 140ba0d50f0a32ae5631a34e77aae581

今回は乱数文字に日時を付与して暗号化してみた
使い捨ての暗号ならこのレベルで良いはず…

Spring Bootで設定ファイルのデータを取得する

設定ファイルというと

iniファイルとかcsvファイルとか独自に用意したプロパティファイルとかあります。
プログラム内の固定値とかではなく実行環境(開発、本番)で設定値が変化する場合に切り替えたいもの

Spring Bootの場合は

application.properties
が基本らしい
他のファイルとしてはymlもあるみたいですね。

設定する情報とは

サーバのポートやデータベースの接続情報などを設定して使うことが基本です。
ですが独自の設定情報を保持したいこともあります。

ので独自の設定値を取得できるかテストします。

サンプル

application.properties
# sample
sample.test1=aaaaaaaaa
sample.test2=222222222
sample.test3=hogehoge

こんな感じ…

取得処理

SampleController.java
package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {
	
	@Autowired
	private Environment eivironment;
	
	@RequestMapping(value = "/sample/getProperty/{key}", method = { RequestMethod.GET } )
	public String test1(@PathVariable String key) {
		return eivironment.getProperty("sample." + key);
	}
	
}

※ Environmentを使用する。

結果

f:id:m_shige1979:20170109222612p:plain
取得できました
設定ファイル名は仕方がないので別途定数で管理しましょう。

今回はここまでですm(_ _)m

Javaで形態素解析ライブラリのkuromojiを使ってみた

形態素解析とかいうので

文字列を単語別に分割できるらしい
全文検索とか名刺だけを取得したい場合とかに使えそう

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example.sample</groupId>
  <artifactId>SampleKaiseki01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
    
    <!-- https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji-core -->
    <dependency>
      <groupId>com.atilika.kuromoji</groupId>
      <artifactId>kuromoji-ipadic</artifactId>
      <version>0.9.0</version>
    </dependency>
  
  </dependencies>
  
</project>

サンプル

Sample01.java
package com.example.sample;

import java.util.List;

import com.atilika.kuromoji.ipadic.Token;
import com.atilika.kuromoji.ipadic.Tokenizer;

public class Sample01 {
	
	public static void main(String[] args) {
		
		Tokenizer tokenizer = new Tokenizer() ;
		
		tokenDisplay(tokenizer.tokenize("山田 太郎"));
		tokenDisplay(tokenizer.tokenize("りんごはおいしい"));
		tokenDisplay(tokenizer.tokenize("この仕事は大変そうです。"));
		tokenDisplay(tokenizer.tokenize("扇風機が動かないんですけど急いで直してくれない?"));
	}
	
	private static void tokenDisplay(List<Token> tokens) {
		for (Token token : tokens) {
			System.out.println(token.getSurface() + "\t" + token.getAllFeatures());
	    	System.out.println(token.getPartOfSpeechLevel1());
	    	System.out.println(token.getPartOfSpeechLevel2());
        }
	}
}

結果

山田	名詞,固有名詞,人名,姓,*,*,山田,ヤマダ,ヤマダ
名詞
固有名詞
 	記号,空白,*,*,*,*, , , 
記号
空白
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
名詞
固有名詞
りんご	名詞,一般,*,*,*,*,りんご,リンゴ,リンゴ
名詞
一般
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
助詞
係助詞
おいしい	形容詞,自立,*,*,形容詞・イ段,基本形,おいしい,オイシイ,オイシイ
形容詞
自立
この	連体詞,*,*,*,*,*,この,コノ,コノ
連体詞
*
仕事	名詞,サ変接続,*,*,*,*,仕事,シゴト,シゴト
名詞
サ変接続
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
助詞
係助詞
大変	名詞,形容動詞語幹,*,*,*,*,大変,タイヘン,タイヘン
名詞
形容動詞語幹
そう	名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー
名詞
接尾
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
助動詞
*
。	記号,句点,*,*,*,*,。,。,。
記号
句点
扇風機	名詞,一般,*,*,*,*,扇風機,センプウキ,センプーキ
名詞
一般
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
助詞
格助詞
動か	動詞,自立,*,*,五段・カ行イ音便,未然形,動く,ウゴカ,ウゴカ
動詞
自立
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
助動詞
*
ん	名詞,非自立,一般,*,*,*,ん,ン,ン
名詞
非自立
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
助動詞
*
けど	助詞,接続助詞,*,*,*,*,けど,ケド,ケド
助詞
接続助詞
急い	動詞,自立,*,*,五段・ガ行,連用タ接続,急ぐ,イソイ,イソイ
動詞
自立
で	助詞,接続助詞,*,*,*,*,で,デ,デ
助詞
接続助詞
直し	動詞,非自立,*,*,五段・サ行,連用形,直す,ナオシ,ナオシ
動詞
非自立
て	助詞,接続助詞,*,*,*,*,て,テ,テ
助詞
接続助詞
くれ	動詞,非自立,*,*,一段・クレル,未然形,くれる,クレ,クレ
動詞
非自立
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
助動詞
*
?	記号,一般,*,*,*,*,?,?,?
記号
一般

所感

使い所がむずかしいな…
なんかいい感じのところで区切ってくれるとありがたいけどまだそこまで精度が高いわけではなさそう
名詞とかで区切る方法がいいのかも…

AWSのS3をMavenのパッケージを使用してアップロード、ダウンロードを実施

キーアクセスには

ファイルの場合と設定ファイルなどよりキーの値より取得する2パターンがある
別途定数などに入れて扱いたいのでちょっと別の方法をやる

BasicAWSCredentials

パラメータに直接キーとシークレットキーを指定するのでキーの元がわかりやすい

pom.xml

  <dependencies>
    
    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk</artifactId>
      <version>1.11.76</version>
    </dependency>
  
  </dependencies>

アップロードサンプル

Sample01.java
package com.example.awssample;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerConfiguration;

public class Sample01 {
    
    // アクセスキー
    private static final String ACCESS_KEY = "アクセスキーの文字列";
    // シークレットアクセスキー
    private static final String SECRET_ACCESS_KEY = "シークレットアクセスキーの文字列";
    // 分割サイズ
    private static final long PART_SIZE = 5 * 1024L * 1024L;
    
    public static void main(String[] args) throws IOException {
        
        byte[] b;
        
        // ファイルを読み込み
        File file = new File("画像ファイパス/sample1.jpg");
        InputStream inputStream = new FileInputStream(file);
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        int data;
        while ((data = inputStream.read()) != -1) {
            bout.write(data);
        }
        b = bout.toByteArray();
        
        // 長さ
        long contentLength = b.length;
        
        // 設定情報
        BasicAWSCredentials credentials;
        credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY); 
        
        // AWSのクライアント取得
        AmazonS3 s3 = new AmazonS3Client(credentials);
        
        // バケット名
        String bucketName = "awsuploadsample";
        
        // アップロードキー名
        String key = UUID.randomUUID().toString();
        
        // パスを指定することで指定の場所へ配置できる
        String objectPath = "sample1/" + key;
        
        // TransferManagerを利用
        TransferManager manager = new TransferManager(s3);
     
        // 分割サイズを設定
        TransferManagerConfiguration c = new TransferManagerConfiguration();
        c.setMinimumUploadPartSize(PART_SIZE);
        manager.setConfiguration(c);
        
        // メタデータに分割したデータのサイズを指定
        ObjectMetadata putMetaData = new ObjectMetadata();
        putMetaData.setContentLength(contentLength);
        
        // upload
        PutObjectRequest object = new PutObjectRequest(bucketName, objectPath, new ByteArrayInputStream(b), putMetaData);
        s3.putObject(object);
    }
    
}

ダウンロードサンプル

Sample02.java
package com.example.awssample;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;


public class Sample02 {
    
    // アクセスキー
    private static final String ACCESS_KEY = "アクセスキーの文字列";
    // シークレットアクセスキー
    private static final String SECRET_ACCESS_KEY = "シークレットアクセスキーの文字列";
    // 分割サイズ
    private static final long PART_SIZE = 5 * 1024L * 1024L;
    
    public static void main(String[] args) throws IOException {
        
        // 設定情報
        BasicAWSCredentials credentials;
        credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY); 
                
        // AWSのクライアント取得
        AmazonS3 s3 = new AmazonS3Client(credentials);
                
        // バケット名
        String bucketName = "awsuploadsample";
                
        // ダウンロードキー名
        String key = "41dbccd0-c33b-44f1-9635-37a73f42b3e7";
         // パスを指定することで指定の場所へ配置できる
        String objectPath = "sample1/" + key;
        
        // リクエストを取得
        GetObjectRequest request = new GetObjectRequest(bucketName, objectPath);
        
        // objectを取得
        S3Object object = s3.getObject(request);
        
        // データ取得
        InputStream is = object.getObjectContent();
        FileOutputStream fos = new FileOutputStream("/Users/matsumotoshigeharu/Documents/sample2.jpg");
        
        // ファイル出力
        byte[] buffer = new byte[5 * 1024 * 1024];
        int readSize = -1;
        while( (readSize = is.read(buffer, 0, buffer.length)) != -1) {
          fos.write(buffer, 0, readSize);
        }
        fos.flush();
    }
    
}

AWSのS3へJavaのSDKを使用してアップロード

AWSへプログラムよりアクセスする

なんかやることが多くなってきた

準備

AWSのIAMでS3用のユーザーを作成し、アクセスキーとシークレットアクセスキーを取得

eclipseへ機能を追加

新規ソフトウェアのインストールで「https://aws.amazon.com/eclipse」を設定

f:id:m_shige1979:20170108152855p:plain

アクセスキーとシークレットアクセスキーを設定する

f:id:m_shige1979:20170108153553p:plain

設定を変更して東京リージョンへする

f:id:m_shige1979:20170108154216p:plain

eclipse

プロジェクトで「AWS Java Project」で作成

f:id:m_shige1979:20170108155455p:plain

Amazon S3 Sample

f:id:m_shige1979:20170108155645p:plain

サンプル
package com.example.awssample;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.UUID;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class S3Sample {

    public static void main(String[] args) throws IOException {

        // eclipseの設定ファイルのパスよりアクセスキー、シークレットアクセスキーを参照
        AWSCredentials credentials = null;
        try {
            credentials = new ProfileCredentialsProvider("default").getCredentials();
        } catch (Exception e) {
            throw new AmazonClientException(
                    "Cannot load the credentials from the credential profiles file. " +
                    "Please make sure that your credentials file is at the correct " +
                    e);
        }

        AmazonS3 s3 = new AmazonS3Client(credentials);
        Region usWest2 = Region.getRegion(Regions.AP_NORTHEAST_1);
        s3.setRegion(usWest2);

        String bucketName = "awsuploadsample";
        String key = UUID.randomUUID().toString();

        System.out.println("===========================================");
        System.out.println("Getting Started with Amazon S3");
        System.out.println("===========================================\n");

        try {
            // バケット名
            System.out.println("Creating bucket " + bucketName + "\n");
            
            // バケット一覧
            System.out.println("Listing buckets");
            for (Bucket bucket : s3.listBuckets()) {
                System.out.println(" - " + bucket.getName());
            }
            System.out.println();

            // ファイルアップロード
            System.out.println("Uploading a new object to S3 from a file\n");
            s3.putObject(new PutObjectRequest(bucketName, key, createSampleFile()));

            // ・ダウンロード
            System.out.println("Downloading an object");
            S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
            System.out.println("Content-Type: "  + object.getObjectMetadata().getContentType());
            displayTextInputStream(object.getObjectContent());

            // 一覧を表示
            System.out.println("Listing objects");
            ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
                    .withBucketName(bucketName)
                    .withPrefix("My"));
            for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                System.out.println(" - " + objectSummary.getKey() + "  " +
                                   "(size = " + objectSummary.getSize() + ")");
            }
            System.out.println();

            // アップロードファイルの削除
            //System.out.println("Deleting an object\n");
            //s3.deleteObject(bucketName, key);
            
        } catch (AmazonServiceException ase) {
            System.out.println("Caught an AmazonServiceException, which means your request made it "
                    + "to Amazon S3, but was rejected with an error response for some reason.");
            System.out.println("Error Message:    " + ase.getMessage());
            System.out.println("HTTP Status Code: " + ase.getStatusCode());
            System.out.println("AWS Error Code:   " + ase.getErrorCode());
            System.out.println("Error Type:       " + ase.getErrorType());
            System.out.println("Request ID:       " + ase.getRequestId());
        } catch (AmazonClientException ace) {
            System.out.println("Caught an AmazonClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with S3, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message: " + ace.getMessage());
        }
    }

    /**
     * Creates a temporary file with text data to demonstrate uploading a file
     * to Amazon S3
     *
     * @return A newly created temporary file with text data.
     *
     * @throws IOException
     */
    private static File createSampleFile() throws IOException {
        File file = File.createTempFile("aws-java-sdk-", ".txt");
        file.deleteOnExit();

        Writer writer = new OutputStreamWriter(new FileOutputStream(file));
        writer.write("abcdefghijklmnopqrstuvwxyz\n");
        writer.write("01234567890112345678901234\n");
        writer.write("!@#$%^&*()-=[]{};':',.<>/?\n");
        writer.write("01234567890112345678901234\n");
        writer.write("abcdefghijklmnopqrstuvwxyz\n");
        writer.close();

        return file;
    }

    /**
     * Displays the contents of the specified input stream as text.
     *
     * @param input
     *            The input stream to display as text.
     *
     * @throws IOException
     */
    private static void displayTextInputStream(InputStream input) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        while (true) {
            String line = reader.readLine();
            if (line == null) break;

            System.out.println("    " + line);
        }
        System.out.println();
    }

}

結果

f:id:m_shige1979:20170108161508p:plain