2

getObject API を使用して aws s3 からファイルをダウンロードしています。単純なテキスト ファイルは正常に機能しますが、pdf をダウンロードするとファイルが破損します。FileOutputStream を使用してコンテンツをファイルに保存していますが、保存した pdf が破損しています。

この目的で使用する正しいJava APIと、読み取られたバイトが書き込まれるバイト配列のサイズについてはよくわかりません。

また、SDK を直接使用することが理にかなっているのか、または Java で利用できるオープン ソースのラッパー API が利用できるのかについても興味があります。

FileOutputStream fout = new FileOutputStream(new File(destFileName));

 byte[] b = new byte[8192];
 int bytesRead;
    while (true) {
     bytesRead = input.read(b);
        System.out.println("bytesRead = "+bytesRead );
        if (bytesRead==-1) 
         break;
        fout.write(b);
    }        
    fout.flush();
    fout.close();
4

1 に答える 1

2

正直に言うと、問題はバッファ全体をFileOutputStream. 送信の最後に、バッファが完全にいっぱい/上書きされず、最後の読み取りから残ったファイルの最後にいくつかのバイトを書き込むことになります。バッファ全体ではなく、入力ストリームから実際に読み取られたバイト数のみを書き込むように、このコードを変更する必要があります。

それ以外の

fout.write(b);

試す

fout.write(b, 0, bytesRead);

このように、最後の読み取り中に 100 バイトのみを読み取った場合、バッファーの最初の 100 バイトのみを書き込み、実際にファイルに既に書き込まれた残りの 8092 バイトを無視します。

于 2011-04-11T01:50:34.617 に答える