先上个代码参考:
public static void testFileInputStream() throws IOException {
File f = new File("d:" + File.separator + "demo.txt");
InputStream input = new FileInputStream(f);
byte[] byteArray = new byte[8192];
int tmp = 0;
while ((tmp = input.read(byteArray)) != -1) {
System.out.println("something1");
}
if (input != null) {
input.close();
}
}
public static void testBufferedInputStream() throws IOException {
File f = new File("d:" + File.separator + "demo.txt");
InputStream input = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(input);
byte[] byteArray = new byte[SIZE];
int tmp = 0;
while ((tmp = bis.read(byteArray)) != -1) {
System.out.println("something2");
}
if (input != null) {
input.close();
}
if (bis != null) {
bis.close();
}
}
最近在看源码。就拿testFileInputStream来比较。如果 read(byteArray) 的byteArray的长度设置的大于或等于BufferedInputStream的缓冲区大小,那 BufferedInputStream还有什么优势呢?
在BufferedInputStream 的
private int read1(byte[] b, int off, int len) throws IOException
方法里有这么个注释:
If the requested length is at least as large as the buffer, and
if there is no mark/reset activity, do not bother to copy the
bytes into the local buffer. In this way buffered streams will
cascade harmlessly.
也就是说如果byteArray的长度大于或者等于buffer的缓冲区长度,那么缓冲区就不起作用了。 我的疑问是:read(byteArray),永远都可以设置的 大于或者等于 buffer的缓冲区长度,我还要 BufferedInputStream 做什么? 难道读取一定量字节(比如1000b):①
一次性读取 1000b ② 一点点读取 (100b,读取10次) 然后放到缓冲区 第②种比① 有什么优势吗?
本人才疏学浅,望大神指正
我看代码,不是你说的那样啊,你设置size 都是在不同对象上设置的。缓冲区 我的理解就是 我要搬家 我每次都要跑到原来的家里拿一个东西之后再放到新家里,可是自从有了车后,我直接将所有的东西放到车里拖到新家门口,然后再从车里拿东西放到新家。
就拿你举的例子来说我的问题是:我要搬家
1.我每次跑到原来的家里可以直接拿100个东西之后再放到新家里(fileinputStream)
2.自从有了车后,我每次拿10个东西共拿10次,将所有的东西放到车里拖到新家门口,然后再从车里拿东西放到新家(bufferinputstream)
这两种方法都可以拿100个东西。那我要bufferedinputstream有啥用
@aoaoaa: 就问 你之前一次般100个东西 累不累,走起路来能快?或许 还丢三落四的(我个人觉得 缓冲区 是对读数据比较大的时候才会有明显的作用。)不要觉得分10次拿和一次拿 都可以实现需求,但是可能速度和质量的问题不同。
@^keepHungry$:嗯。所以我一开始就问第②种比① 有什么优势,①有什么缺点 阻塞?还是什么。在网上搜不到答案,只好来问问了
额,缓冲类的功能是将字节流变为字符流。具体实用的方法就是将System.in作为字节输入流读取用户的输入。
它是读取键盘输入的标准格式,是很根本的东西,现在有scanner了可也不能忘记实现的原理