2009-08-28 206 views
0

有人可以向我解釋使用緩衝區的用法,也可能是一些簡單的(記錄在案的)正在使用的緩衝區的例子。謝謝。緩衝區和字節?

我在Java編程的這個領域缺乏太多的知識,所以請原諒我,如果我問錯了問題。 :s

+0

我認爲你需要更具體。到目前爲止,這似乎並不特定於Java - 除非您指的是java.nio.ByteBuffer?你有什麼特別的想法,你遇到了什麼問題? – 2009-08-28 10:56:31

回答

2

緩衝區是在那裏它被處理之前的數據臨時存儲在內存中的空間。請參閱Wiki article

下面介紹如何使用ByteBuffer類的簡單Java example

更新

public static void main(String[] args) throws IOException 
{ 
    // reads in bytes from a file (args[0]) into input stream (inFile) 
    FileInputStream inFile = new FileInputStream(args[0]); 
    // creates an output stream (outFile) to write bytes to. 
    FileOutputStream outFile = new FileOutputStream(args[1]); 

    // get the unique channel object of the input file 
    FileChannel inChannel = inFile.getChannel(); 
    // get the unique channel object of the output file. 
    FileChannel outChannel = outFile.getChannel();  

    /* create a new byte buffer and pre-allocate 1MB of space in memory 
     and continue to read 1mb of data from the file into the buffer until 
     the entire file has been read. */ 
    for (ByteBuffer buffer = ByteBuffer.allocate(1024*1024); inChannel.read(buffer) != 1; buffer.clear()) 
    { 
     // set the starting position of the buffer to be the current position (1Mb of data in from the last position) 
     buffer.flip(); 
     // write the data from the buffer into the output stream 
     while (buffer.hasRemaining()) outChannel.write(buffer); 
    } 

    // close the file streams. 
    inChannel.close(); 
    outChannel.close();  
} 

希望掃清事情了一點。

+0

也許你可以複製那些簡單的代碼和文檔每行? – Rifk 2009-08-28 11:02:21

+0

感謝您的記錄,真的有幫助! – Rifk 2009-08-28 11:17:51

+0

+1用於記錄這段醜陋的代碼。看看那個for循環!異常處理(不保證通道關閉後)!我以此爲例來教導我的團隊提供乾淨的代碼。 – 2009-08-28 11:55:28

1

對於緩衝區,人們通常意味着要臨時存儲一些數據的一些內存塊。緩衝區的一個主要用途是在I/O操作中。

像硬盤這樣的設備擅長快速讀取或寫入磁盤上的連續位塊。如果您告訴硬盤「讀取這10,000個字節並將其放入內存中」,則可以非常快速地讀取大量數據。如果你要編程一個循環並逐個獲取字節,告訴硬盤每次獲得一個字節,這將是非常低效和緩慢的。

因此,您創建一個10,000字節的緩衝區,告訴硬盤一次讀取所有字節,然後從內存緩衝區中逐個處理這些10,000字節。