黑马程序员技术交流社区

标题: BuffereredInputStream初始化问题 [打印本页]

作者: ssx0101    时间: 2012-11-18 14:44
标题: BuffereredInputStream初始化问题
本帖最后由 曹自祥 于 2012-11-19 16:19 编辑
  1. package pt;

  2. import java.io.*;

  3. public class BufferTest {

  4.         /**
  5.          * @param args
  6.          * @throws FileNotFoundException
  7.          */
  8.         public static void main(String[] args) throws FileNotFoundException {
  9.                 File f=new File("F:\\test.txt");//文件F:\\test.txt大小是10M
  10.                 FileInputStream fis=new FileInputStream(f);
  11.                 BufferedInputStream bis=new BufferedInputStream(fis,1024);//fis对应的文件大于1024B,这样的代码会有问题吗?
  12.         }

  13. }
复制代码

作者: 奚华    时间: 2012-11-18 16:20
没有问题,如果文件大于1024B,那么你可以分多次读取,比如
  1. byte[] buf=new byte[1024];
  2.          int len=0;
  3.          while((len=bis.read(buf,0,1024))!=-1)//循环读取
  4.          {
  5.                 ;//一些代码
  6.          }
复制代码
当然缓冲区的大小会影响到读取的效率,以及对系统资源的消耗
作者: ssx0101    时间: 2012-11-18 17:02
把文件的字节码保存进输入流是在初始化输入流时进行的还是在输入流对象执行read方法时执行的?
作者: 奚华    时间: 2012-11-18 17:18
我个人理解认为,输入流啊输出流啊不过是些对象,其实最底层调用的是本地方法,比方说C的方法,甚至是windows的API,你可以这样理解,你创建一个输出流对象或者输入流对象不过是做好读取或写入数据的准备,读取或写入是java虚拟机调用一连串的方法或函数进行的,先从过滤流的调用到节点流,再从节点流调用到底层的本地方法,所以从这个角度来说把文件的字节码保存进输入流是在调用最底层的本地方法后的,这样理解的话,肯定在read方法执行时。初始化输入流应该在一个对象的初始阶段。
作者: 奚华    时间: 2012-11-18 17:19
流的确难以理解,想简单些就好办了!
作者: ssx0101    时间: 2012-11-18 20:53
写了几个例子琢磨了一下,差不多想通了。
输入流并不是把数据存在输入流,而是提供一个读取数据的通道。
在输入流调用read()的时候,输入流把数据从源(输入流初始化时确定源,如上文的f)复制进目的(执行read时确定目的,如buf)。
字节流执行read()时把字节码从源取一个就往目的写一个;
字符流和缓冲流执行read时先从源读一定数量字节码,再一并写进目的。
作者: 陈军    时间: 2012-11-19 11:44
自定义直接缓冲区。循环读取就可以了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2