我试图在性能方面比较InputStream.read()
和InputStream.read(byte[] b)
。每次读取单字节与多个字节时的性能?
是InputStream.read(byte[] b)
以某种方式更快,给予InputStream
类read(b, off, len)
方法简单地调用该方法read()
反复?
我试图在性能方面比较InputStream.read()
和InputStream.read(byte[] b)
。每次读取单字节与多个字节时的性能?
是InputStream.read(byte[] b)
以某种方式更快,给予InputStream
类read(b, off, len)
方法简单地调用该方法read()
反复?
你不应该混淆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 []。
使用无论你在哪种情况下最方便的方式,但请记住用BufferedInputStream
包装InputStream
。
没有缓冲单个文件read()
会在您每次读取时触击基础流(例如文件系统)。通过缓冲区read()
加载一个块(例如4KiB)并对其进行缓冲。很明显,从磁盘读取数据(即使存在一些较低的操作系统/硬盘缓存)也要慢得多。
因此,read(byte[] b)
只有在您的数据流未被缓冲时才更好 - 或者您确实想读取多个字节。
一次读取一个字符/字节(即InputStream.read()), 或一次读取一个字节/字符数组的块数据。read(byte [] b)方法有什么区别也是要调用read()方法重复byte/char数组声明的时间块吗? – 2012-07-16 10:16:13
@ Tomasz Nurkiewicz:谢谢但不包括BufferedInputStream的情况。 如果我们只讨论InputStream ..那么这两种方法都会导致相同的性能......这是真的吗? – 2012-07-16 10:24:14
@AshishKataria你只是在这里重复原来的问题,他已经回答了。如果你设置了一个'BufferedInputStream',那么这个操作就没有单字节的读操作了,就是它的用途。 – EJP 2012-07-16 10:36:18
PeterLawrey:非常感谢杰出的解释。那么这意味着InputStream的所有3种方法一次只能读取一个字节,而不管我们在read(byte [])中指定的字节数? – 2012-07-16 11:26:04
不,我想详细说明为什么这不是这种情况。我不清楚为什么你会相信这可能是事实。 – 2012-07-16 11:33:35
谢谢..现在我明白了.. – 2012-07-16 12:13:00