2012-07-16 64 views

回答

4

你不應該混淆InputStream的默認行爲和它的大部分子類是做什麼的。 OO設計的一個原則是子類可以改變該實現方法的行爲。

從InputStream - read(byte [])重複調用read()。

public int read(byte b[], int off, int len) throws IOException { 
    // code removed 

     for (; i < len ; i++) { 
      c = read(); 

    // code removed 
} 

從BufferedInputStream - read(byte [])不調用read()。

public synchronized int read(byte b[], int off, int len) throws IOException { 
    // code removed 
     int nread = read1(b, off + n, len - n); 
    // code removed 
} 

private int read1(byte[] b, int off, int len) throws IOException { 
    // code removed 
      return getInIfOpen().read(b, off, len); 
    // code removed 
} 

從FileInputStream - read(byte [])不調用read()。

public int read(byte b[], int off, int len) throws IOException { 
    return readBytes(b, off, len); 
} 

private native int readBytes(byte b[], int off, int len) throws IOException; 

雖然InputStream的將讀取在時間(字節[])的一個字節,幾乎所有的實施方式將讀通到底層流中的相同的方法。

注意:read(byte [],int,int)的實現在所有三種情況下是不同的。

我在說什麼要問更清楚的是:比方說,我想讀的20個字節,同時每一次會打底層流(例如文件系統),在一個循環中,這意味着20倍讀一個字節.. OK現在,一次讀取20個字節的數組,即使用read(byte [] 20),現在這會打擊基礎流(例如文件系統)一次或20次。 (因爲它的給定:read(byte [] b)方法也會重複調用read()方法20次)

無論您使用BufferedInputStream還是FileInputStream,一次讀取(byte [])將導致最多一次系統調用讀取byte []。

+0

PeterLawrey:非常感謝傑出的解釋。那麼這意味着InputStream的所有3種方法一次只能讀取一個字節,而不管我們在read(byte [])中指定的字節數? – 2012-07-16 11:26:04

+2

不,我想詳細說明爲什麼這不是這種情況。我不清楚爲什麼你會相信這可能是事實。 – 2012-07-16 11:33:35

+0

謝謝..現在我明白了.. – 2012-07-16 12:13:00

2

使用無論你在哪種情況下最方便的方式,但請記住用BufferedInputStream包裝InputStream

沒有緩衝單個文件read()會在您每次讀取時觸擊基礎流(例如文件系統)。通過緩衝區read()加載一個塊(例如4KiB)並對其進行緩衝。很明顯,從磁盤讀取數據(即使存在一些較低的操作系統/硬盤緩存)也要慢得多。

因此,read(byte[] b)只有在您的數據流未被緩衝時才更好 - 或者您確實想讀取多個字節。

+0

一次讀取一個字符/字節(即InputStream.read()), 或一次讀取一個字節/字符數組的塊數據。read(byte [] b)方法有什麼區別也是要調用read()方法重複byte/char數組聲明的時間塊嗎? – 2012-07-16 10:16:13

+0

@ Tomasz Nurkiewicz:謝謝但不包括BufferedInputStream的情況。 如果我們只討論InputStream ..那麼這兩種方法都會導致相同的性能......這是真的嗎? – 2012-07-16 10:24:14

+0

@AshishKataria你只是在這裏重複原來的問題,他已經回答了。如果你設置了一個'BufferedInputStream',那麼這個操作就沒有單字節的讀操作了,就是它的用途。 – EJP 2012-07-16 10:36:18

相關問題