0

私は次のコードを持っていますが、効率/フラッシュ/ストリームのクローズに関してすべてを正しく行っているかどうかはわかりません。いくつかのアドバイスは大いに役立ちます、ありがとう

    OutputStream out = null;
    try {
        out = new BufferedOutputStream(new FileOutputStream(file, true));
        byte[] buf = new byte[32 * 1024]; // should this be 32KB?
        while ((in.read(buf)) > 0) {
            out.write(buf);
        }
        out.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null)
                out.close();
            if (in != null)
                in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
4

2 に答える 2

2

最も重要な問題は、読み取ったバイト数を無視していることです。

for(int len; (len = in.read(buf)) > 0;) 
        out.write(buf, 0, len);

常に正確に 32 KB を読み取ると想定している長さを使用しない場合、これは大きな想定です。


バッファは、小さな書き込みがたくさんある場合に便利です。

BufferedOutputStream のデフォルトのバッファー サイズは 8 KB であり、書き込みがこれよりもはるかに小さい場合、つまり 512 バイト未満の場合は、実際に役立ちます。

ただし、32 KB と書いている場合、おそらく何もしていないか、役に立たないでしょう。私はそれらを取り出します。

ところで、バッファがなければ、flush(); を呼び出す必要はありません。

ところで2

KB = 1024 bytes
kB = 1000 bytes
Kb = 1024 bits
kb = 1000 bits.
于 2015-08-25T16:08:24.910 に答える
1

あなたのコードは「うまくいくか」という観点からは問題ないように見えます...ただし、try with resource を使用することで、「きれいに」見えるようにすることができます。 リソースを試してみてください 提供されたコードは、基本的に次のようになります。

try(OutputStream out = new BufferedOutputStream(new FileOutputStream(file, true)) {
    byte[] buf = new byte[1024];
    while ((in.read(buf)) > 0) {
        out.write(buf);
    }
    out.flush();
}

これは Java7 の機能であり、ストリーム リソースが java.lang.AutoCloseable を実装している場合、自動的に閉じられます。

何をしようとしているかにもよりますが、次の行に沿った何かがより簡単な解決策になる可能性がありますか?

PrintStream p = new PrintStream(new BufferedOutputStream(new FileOutputStream(aFile, true)));
于 2015-08-25T16:19:27.960 に答える