ここに私が得ている警告があります:
S3AbortableInputStream:すべてのバイトがS3ObjectInputStreamから読み取られなかったため、HTTP接続が中断されました。これはおそらくエラーであり、最適な動作にならない可能性があります。必要なバイトのみをレンジGETでリクエストするか、使用後に入力ストリームをドレーンします。
リソースでtryを使用しようとしましたが、S3ObjectInputStreamはこのメソッドを介して閉じないようです。
try (S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
//some code here blah blah blah
}
また、以下のコードを試して明示的に閉じましたが、それも機能しません:
S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
//some code here blah blah
s3ObjectInputStream.close();
s3object.close();
}
任意の助けをいただければ幸いです。
PS:S3からファイルの2行しか読み取っていないのに、ファイルにさらにデータがあります。
他の媒体を介して答えを得た。ここで共有:
この警告は、ファイル全体を読み取らずにclose()を呼び出したことを示します。 S3はまだデータを送信しようとしており、接続を悲しい状態のままにしているため、これは問題です。
ここには2つのオプションがあります。
Chirag Sejpalの回答(オプション#1で詳述)に例を追加するには、次を使用して、入力ストリームを閉じる前に入力ストリームから残りのデータを読み取ります。
S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
try (S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent()) {
try {
// Read from stream as necessary
} catch (Exception e) {
// Handle exceptions as necessary
} finally {
while (s3ObjectInputStream != null && s3ObjectInputStream.read() != -1) {
// Read the rest of the stream
}
}
// The stream will be closed automatically by the try-with-resources statement
}