2009-08-04 45 views
2

java.io.FileInputStream,有一種方法int read(Byte[] buffer,int offset,int numBytes);我們如何使用這個功能 - 這個方法和read(byte[] buffer)有什麼不同?使用Java的FileInputStream

+5

要回答這個問題只需要一些批判性思維。考慮到你知道兩個函數之間的方法參數的區別,你認爲*的區別是什麼?將您的猜測與文檔進行比較。 – 2009-08-04 10:48:49

回答

7

正如Javadoc中指出(和參數的名稱指示),失調和的numBytes方法只使用緩衝區的一部分,把它的產出分析。

public int read(byte[] b, 
      int off, 
      int len) 
    throws IOException 

Parameters: 
    b - the buffer into which the data is read. 
    off - the start offset of the data. 
    len - the maximum number of bytes read. 

你可以使用這種方法,如果你想重新使用一個已經有數據的現有緩衝區,你不想破壞(當然,從offset開始的numBytes將被覆蓋)。

在Java中,緩衝區中的幾乎所有操作都提供這種類型的接口。正確使用,您可以避免多次複製/緩衝數據。

+0

如果您使用緩衝區同時緩衝和處理來自流的數據,那麼這非常有趣。例如,某些媒體格式的解碼器可能會將數據從流中讀取到緩衝區中,而另一個線程從此緩衝區中獲取值以處理它們。由於緩衝區之前可能會填充某些值,因此您需要在給定偏移量處開始重新填充(因此使用第二個參數)。如果你完全填充緩衝區,你將從頭開始,但只使用已由另一個線程處理的空間,並使用len-param來實現這一點。 – Mnementh 2009-08-04 10:55:59

1

剛剛從javadoc得到了這個。

從該輸入流中將len個字節的數據讀入字節數組。如果len不爲零,則該方法將阻塞,直到某些輸入可用;否則,不讀取字節並返回0。

參數:

  • b - 將所述讀取數據的緩衝器。
  • off - 目標數組中的起始偏移b
  • len - 讀取的最大字節數。

返回: 讀入緩衝區的總字節數,或-1,如果沒有更多的數據,因爲該文件的結尾已經到達。

http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html#read(byte[],INT,INT)

1

這個功能是非常有用的閱讀整個文件到內存中。看到這個例子,

File = new File("/anywhere/anyfile"); 
InputStream is = new FileInputStream(file); 
long fileSize = file.length(); 
byte[] bytes = new byte[(int)fileSize]; 
int offset = 0; 
int count=0; 
while (offset < fileSize) { 
    count=is.read(bytes, offset, fileSize-offset)); 
    if (count >= 0) 
     offset += count; 
    else 
     throw new IOException("Can't read file "+file.getName()); 
} 
is.close(); 
// Now bytes has all the complete file. 
相關問題