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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦想蓝色天空 高级黑马   /  2013-5-29 22:20  /  2639 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梦想蓝色天空 于 2013-5-31 08:00 编辑

最近在看毕老师的基础视频,疑惑点比较多,现在主要对BufferInputStream使用方面有点问题

FileInputStream fis = new FileInputStream("D:\\aa.txt");
   BufferedOutputStream bos = new BufferedOutputStream(
     new FileOutputStream("D:\\aa.txt"));
   byte[] b = new byte[1024];
   int len = fis.read(b);    --1
   while (len != -1) {
    bos.write(b);       --2
    len = fis.read(b);    --3
   }
   bos.flush();   --4
   bos.close();
   fis.close();

在1的位置从硬盘读1024个字节的存放到byte数组里面
在2的位置加入到BufferOutStream的缓存中     
在3的位置再继续读1024个字节信息到Byte数组里面
在4的位置把BufferOutStream的缓存中的数据刷到要保存的硬盘中

问题:1、是不是可以认为这个byte的数组是一个缓存区,用来存放读取出的数据和提供给输出缓存的数据
        2、如果可以的话,为什么还要用到BufferInputStream,这样写不是更简单吗


  

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

7 个回复

倒序浏览
同学,你这代码有问题吧
FileInputStream fis = new FileInputStream("");            
int len = fis.read(b);    --1

fis构造函数没传值,fis.read()读什么呢?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
mvplee 发表于 2013-5-29 22:40
同学,你这代码有问题吧
FileInputStream fis = new FileInputStream("");            
int len = fis.rea ...

嗯。谢谢。这个知道。。只是模拟一下,假如里面有值的话。。。那两个问题应该如何说呢?
回复 使用道具 举报
梦想蓝色天空 发表于 2013-5-29 23:28
嗯。谢谢。这个知道。。只是模拟一下,假如里面有值的话。。。那两个问题应该如何说呢? ...

已修改过:loveliness:
回复 使用道具 举报
本帖最后由 刘勇强 于 2013-5-30 01:06 编辑

lz你的代码里 把aa.txt内容写到aa.txt是看不出效果的 你写回了原文件里

public class Ww {

        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                FileInputStream fis = new FileInputStream("D:\\aa.txt");
                BufferedOutputStream bos = new BufferedOutputStream(
                  new FileOutputStream("D:\\aaa.txt"));
               
                int by= 0;
                while((by=fis.read())!=-1)
                {
                        bos.write(by);
                }
        
                bos.close();
                fis.close();

        }

}
这是改过后的代码 从aa.txt 写到aaa.txt ,直接从输入流读取到输出流,没必要用一个字节数组中转.

之所以要把FileInputStream打包成BufferedInputStream, 用毕老师的话就是,你直接用FileInputStream是读一个字节往硬盘写一次,效率太低,而BufferedInputStream是创建一个内部缓冲区,读完后最后写道文件里 提高效率.  我上面的代码是可以打包FileInputStream 用BufferedInputStream的

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
个人理解:
虽然这样的代码看上去 简洁, 但是相对于输入输出 仍然有很多问题没有处理,比如 多线程安全问题等
回复 使用道具 举报
刘勇强 发表于 2013-5-30 01:04
lz你的代码里 把aa.txt内容写到aa.txt是看不出效果的 你写回了原文件里

public class Ww {

毕老师有一节课讲的是BufferedInputStream的原理和自定义BufferedInputStream,在自定义的BufferedInputStream里面也就自己创建了一个byte[1024]来作为缓存区,read(b)就是把硬盘信息读到byte[1024]中(其中这个方法也还是调用的FileInputStream的read()方法,只不过是一下子读取了1024个字节),BufferOutStream再对他进行读取。。我个人感觉这两种方法其实是一样的,如果一样的话,直接存数据做为缓存更简单,为什么要使用BufferedInputStream呢?
回复 使用道具 举报
经过两天研究,感觉可能是存到流到流里面,要比机械式的从byte[]直接存到硬盘里面速度快,结贴啦,不纠结了,暂时会用就成了啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马