FileInputStream的read方法,在使用的时候,如果采用了read(byte[] b,int off,int len)这个方法,也就是说将读取到的数据先放到一个数组中,然后再放到流中,这个过程是怎样工作的?是不是每次从磁盘上读取一个字节,然后写到byte数组中,当读取完长度为len的时候,再将数组写到输入流中???如果是这样,那么采用缓冲流BufferedInputStream和它又有什么区别呢?请教高手。
9 个解决方案
#1
api有解释,都是读取字节,BufferedInputStream添加了别的方法而已。
#2
如果真想弄清楚得看源码啦,都不难的
#3
lz太懒了,自己google下,啥都知道了
#4
FileInputStream.read(byte[] b,int off,int len)方法,
是从IO中读取len个字节,放入b中,放入的起始位置是off。
这个方法是阻塞读的,仅当IO读取到末尾或者成功读取len个字节时,返回。
否则,读取过程中,当前线程会被阻塞,或者抛出IO异常。
BufferedInputStream的主要区别有两个:
1.读取时,会根据需要,先将IO的数据填充到缓冲区中,然后在复制给b数组。
FileInputStream.read(byte[] b,int off,int len)方法,直接将IO的数据放入b数组中。
2.支持 mark 和 reset 方法。
是从IO中读取len个字节,放入b中,放入的起始位置是off。
这个方法是阻塞读的,仅当IO读取到末尾或者成功读取len个字节时,返回。
否则,读取过程中,当前线程会被阻塞,或者抛出IO异常。
BufferedInputStream的主要区别有两个:
1.读取时,会根据需要,先将IO的数据填充到缓冲区中,然后在复制给b数组。
FileInputStream.read(byte[] b,int off,int len)方法,直接将IO的数据放入b数组中。
2.支持 mark 和 reset 方法。
#5
你看下InputStream的源码就知道呢。这个很容易弄到。好像安装jdk时,就会有一份在目录下的。
read(byte[] b,int off,int len)是会循环调用read()方法的:
BufferedInputStream是继承InputStream,只是在上面加了一个byte[] buf,
还有一个特点,就是它的方法是同步的,可以用在多线程。
当然你也要可以自己建一个byte[] buf来实现读取,只是会麻烦点,也没有线程安全。
建立缓冲,只是为了减少output的次数或有些功能需要是连续的字节流。
read(byte[] b,int off,int len)是会循环调用read()方法的:
for (; j < paramInt2; j++) {
i = read();
if (i == -1) {
break;
}
if (paramArrayOfByte != null)
paramArrayOfByte[(paramInt1 + j)] = (byte)i;
}
BufferedInputStream是继承InputStream,只是在上面加了一个byte[] buf,
还有一个特点,就是它的方法是同步的,可以用在多线程。
当然你也要可以自己建一个byte[] buf来实现读取,只是会麻烦点,也没有线程安全。
建立缓冲,只是为了减少output的次数或有些功能需要是连续的字节流。
#6
看源代码这个理由好!
#7
东西太多了哪看得过来哦
#8
Google关键字搜索...
API多看看 哪里不懂看哪里 最好写些测试例子 加深理解
API多看看 哪里不懂看哪里 最好写些测试例子 加深理解
#9
顶,有问题还是自己多看源码!
#1
api有解释,都是读取字节,BufferedInputStream添加了别的方法而已。
#2
如果真想弄清楚得看源码啦,都不难的
#3
lz太懒了,自己google下,啥都知道了
#4
FileInputStream.read(byte[] b,int off,int len)方法,
是从IO中读取len个字节,放入b中,放入的起始位置是off。
这个方法是阻塞读的,仅当IO读取到末尾或者成功读取len个字节时,返回。
否则,读取过程中,当前线程会被阻塞,或者抛出IO异常。
BufferedInputStream的主要区别有两个:
1.读取时,会根据需要,先将IO的数据填充到缓冲区中,然后在复制给b数组。
FileInputStream.read(byte[] b,int off,int len)方法,直接将IO的数据放入b数组中。
2.支持 mark 和 reset 方法。
是从IO中读取len个字节,放入b中,放入的起始位置是off。
这个方法是阻塞读的,仅当IO读取到末尾或者成功读取len个字节时,返回。
否则,读取过程中,当前线程会被阻塞,或者抛出IO异常。
BufferedInputStream的主要区别有两个:
1.读取时,会根据需要,先将IO的数据填充到缓冲区中,然后在复制给b数组。
FileInputStream.read(byte[] b,int off,int len)方法,直接将IO的数据放入b数组中。
2.支持 mark 和 reset 方法。
#5
你看下InputStream的源码就知道呢。这个很容易弄到。好像安装jdk时,就会有一份在目录下的。
read(byte[] b,int off,int len)是会循环调用read()方法的:
BufferedInputStream是继承InputStream,只是在上面加了一个byte[] buf,
还有一个特点,就是它的方法是同步的,可以用在多线程。
当然你也要可以自己建一个byte[] buf来实现读取,只是会麻烦点,也没有线程安全。
建立缓冲,只是为了减少output的次数或有些功能需要是连续的字节流。
read(byte[] b,int off,int len)是会循环调用read()方法的:
for (; j < paramInt2; j++) {
i = read();
if (i == -1) {
break;
}
if (paramArrayOfByte != null)
paramArrayOfByte[(paramInt1 + j)] = (byte)i;
}
BufferedInputStream是继承InputStream,只是在上面加了一个byte[] buf,
还有一个特点,就是它的方法是同步的,可以用在多线程。
当然你也要可以自己建一个byte[] buf来实现读取,只是会麻烦点,也没有线程安全。
建立缓冲,只是为了减少output的次数或有些功能需要是连续的字节流。
#6
看源代码这个理由好!
#7
东西太多了哪看得过来哦
#8
Google关键字搜索...
API多看看 哪里不懂看哪里 最好写些测试例子 加深理解
API多看看 哪里不懂看哪里 最好写些测试例子 加深理解
#9
顶,有问题还是自己多看源码!