2017-02-04 2 views
1

私はパイプを持っており、そこからデータを読み込む必要があります。しかし、私が読んで理解するように、私はある程度の大きさのバッファを作る必要があります。問題は、パイプからallデータを読み取るためにバッファのサイズを定義する方法ですか?Java:FileChannelからすべてのデータを読み込むためにバッファのサイズを定義する方法

これは私のコードです:

RandomAccessFile aFile  = new RandomAccessFile(PIPE_FILE, "r"); 
FileChannel inChannel = aFile.getChannel(); 
ByteBuffer buf = ByteBuffer.allocate(4);//temp 4 
while(true){ 
    System.out.println("Size:"+inChannel.size());//returns 0 
    int bytesRead = inChannel.read(buf); 
    byte [] bytes=buf.array(); 
    ... 
    buf.clear(); 
} 
+0

このバッファサイズの選択は次のとおりです。読める時間と記憶の間にはじまる。サイズを小さくすると、ループが使用されなくなり、サイズが大きくなるとメモリが増えるため、時間がかかります。私は '1024 'を選ぶためにカンタン値として見ました。 –

+0

ユーザーが['Files.readAllBytes'](https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes代わりにjava.nio.file.Path))? – BackSlash

+0

@BackSlash真実を伝えるにはわからない。多くの例では、インターネットの人々がRandomAccessFileを使用して名前付きパイプからデータを読み込むことを推奨しています。 –

答えて

3

ファイルとは異なり、パイプが固定サイズ持っていません。私たちが知っているすべてのために、パイプのもう一方の端のライターがするアルゴリズム作成したデータをプッシュすることができますがパイプストリームは無限になる可能性があります。

通常は数百から千バイトのバッファを作成し、ループでパイプから読み込み、データストリームを処理したり、動的に割り当てられたバッファに保存したりする必要がありますループ。

1

私はまだコメントを送信することは許されないのですので、私は私の理解に基づいて回答します:

私はこれがRandomAccessFileのであるという事実に焦点を当てます。別の回答で示唆したように

、関係なく、あなたのバッファのサイズを、あなたは最後までループでそれを読むことができます:

それ以外
while(inChannel.read(buf) >= 0) 
{ 
} 

、にもかかわらず、正確にあなたの最初の質問に答えるためにあなたのファイル/パイプは、たぶんサイズが大きくなるので、あなたのバッファに使うことができますが、中間のファイルが変更されていると、不完全な読み込みやエラーが発生する可能性があります。パイプがクリアされるなど):

ByteBuffer buf = ByteBuffer.allocate(inChannel.size()); 
+0

注: '> 0'ではなく'> = 0'を使いたいとします。 -1はストリームの終わりを示します。 0は、今回は*読み込まれたバイトがないことを意味しますが、次回はそこにあるかもしれません。 –

+0

そこに素敵な区別、私のポストを編集します、ありがとう。小さな細部は鍵です:)。 – roboris

関連する問題