A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ssx0101 中级黑马   /  2012-11-18 14:44  /  1657 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曹自祥 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

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

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 呵呵

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马