0

私はそのように宣言されたJava変数を持っています:

RandomAccessFile file = new RandomAccessFile("path-to-file");
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD())));

問題は、2048 が整数 (または 8192 バイト) を導入した後、別の整数を書き込もうとすると、出力が警告なしにディスクにフラッシュされることです。

いくつかの調査の後、DataOutputStream には 64k の制限があることがわかりました。BufferedOutputStream または FileOutputStream に関する公式の情報は見つかりませんでした。

どの構造にこの制限があり、どうすればそれを増やすことができるか教えてください。

また、単に例外を発生させるのではなく、なぜ構造体が通知されずにフラッシュするのかを調べるのもよいでしょう?

4

1 に答える 1

3

BufferedOutputStreamデフォルトのサイズは8192です

public BufferedOutputStream(OutputStream out) {
     this(out, 8192);
}

BufferedOutputStream必要なバッファ サイズを表す秒パラメータを作成するだけです。

int BUFFER_SIZE= <some value>;

DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD()), BUFFER_SIZE));

ただし、これはあなたが望むものではないかもしれません! 書き込みをキューに入れ、(フラッシュ時に) 1 つの大きなチャンクに書き込むことが、まさに の目的であり、BufferedOutputStreamパフォーマンスが大幅に向上します。フラッシング時は特に問題ありません。最後の書き込みを行った後にフラッシュすることを確認してください。

DataOutputStreamさらに、間違った 64K 制限を取得したと確信しています。
それ自体は無制限のバイトを書き込みますが、UTF-8 としてエンコードされた場合、最大長が 64K の文字列のみを書き込みます。また、書き込まれたバイト数のカウンターも含まれています。明らかに、これはInteger.MAX_VALUE書き込まれたバイトの後にオーバーフローしますが、それは問題ではありません!

于 2013-09-26T18:33:40.310 に答える