黑马程序员技术交流社区

标题: IO流中缓冲区问题。 [打印本页]

作者: CitySe    时间: 2014-9-14 01:05
标题: IO流中缓冲区问题。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferIODemo {

        public static void main(String[] args) throws IOException {
                copyTxtDemo();
        }

        public static void copyTxtDemo() throws IOException {
                //创建缓冲区对象。
                FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\API.CHM");
                FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\A.CHM");
                BufferedInputStream fils = new BufferedInputStream(fis);
                BufferedOutputStream fosl = new BufferedOutputStream(fos);
                byte[] by = new byte[1024];
                int len = 0;
                while((len=fils.read(by))!=-1){
                        fosl.write(by,0,len);
                        fosl.flush();
                }
                fis.close();
                fos.close();
        }

}

作者: CitySe    时间: 2014-9-14 01:07
我想问一下,fils.read(by)这里,是以数组的形式在文件里面读吗?就是一次读1024个还是读了之后存进数组里面,谢谢了
作者: 孤鸢    时间: 2014-9-14 10:34
本帖最后由 孤鸢 于 2014-9-14 10:36 编辑

首先肯定的是,数据肯定是一个字节一个字节的读,而read()内部也是封装了循环,要么读到数据结尾(文件大小不足byte[]),要么就给byte[]数组装满,而write对应的内部也封装了一个循环,给byte[]数组数据写完,所以相对于外面的while循环,就是先给byte[]中的数据写完,才循环一次,感觉好像就是一次性写完一样,你可以设置一个计数器,在f.write(buf,0,len)之前count++,然后找一个大于1K的文件(因为你的数组定义的是 1k),会发现写了 文件大小/k 的整数次。
作者: rel4x    时间: 2014-9-14 10:46
学习了。。。。




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