2012-07-16 59 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

相关问题