1

複数の小さなファイルを読み取り、それらをより大きな単一のファイルに追加する必要があります。

Base64OutputStream baos = new Base64OutputStream(new FileOutputStream(outputFile, true));

for (String fileLocation : fileLocations) {
InputStream fis = null; 
        try
        {
            fis = new FileInputStream(new File(fileLocation));
            int bytesRead = 0;
            byte[] buf = new byte[65536];
            while ((bytesRead=fis.read(buf)) != -1) {
                if (bytesRead > 0) baos.write(buf, 0, bytesRead);
            }
        }
        catch (Exception e) { 
            logger.error(e.getMessage());
        }
        finally{
            try{
                if(fis != null)
                    fis.close();
            }
            catch(Exception e){
                logger.error(e.getMessage());
            }
        }
}

すべて非常に標準的ですが、入力ファイルごとに新しいbaosを開かない限り(ループ内に含める)、baosによって書き込まれた最初のファイルに続くすべてのファイルが間違っていることがわかりました(誤った出力)。

質問:

  • 同じリソースに対して出力ストリームを開いたり閉じたりするのは良い習慣ではないと言われましたが、なぜですか?
  • 単一の出力ストリームを使用しても、複数の別々のストリームを使用した場合と同じ結果が得られないのはなぜですか?
4

1 に答える 1

1

おそらく問題は、base64 でのエンコーディングを想定している場合、複数のファイルを連結すると、各ファイルの base64 エンコーディングを連結した場合と同じ結果になるはずであるということでしょうか? 必ずしもそうではありません。base64 は、連続する 3 つの入力バイトのグループを 4 つの ASCII 文字にエンコードするため、各ファイルのサイズが 3 の倍数であることがわかっていない限り、base64 エンコードはまったく異なる出力を生成します。

于 2012-12-04T03:45:41.383 に答える