2017-02-04 64 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'作爲comman價值被選中。 –

+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