黑马程序员技术交流社区

标题: IO [打印本页]

作者: 周一川    时间: 2013-3-31 19:51
标题: IO
本帖最后由 田磊阳 于 2013-4-4 09:35 编辑

FileInputStream和FileOutputStream,
d.使用BufferedInputStream和BufferedOutputStream

这样有什么区别, 都是一个可以拷贝文件的字节流
作者: 刘松老师    时间: 2013-3-31 21:00
FileInputStream和FileOutputStream是字节流,字节流是读一个写一个或者读一个byte读一个byte,BufferedInputStream和BufferedOutPutStream是缓冲流,
它带有一个缓冲区,BufferedInputStream可以读取比FileInputStream更多的数据,以减少访问IO的次数,访问IO的次数越少,性能就越高,如果文件很大的话建议使用BufferedInputStream和BufferedOutPutStream,这样效率会比较高
作者: HM刘俊    时间: 2013-4-1 13:30
FileInputStream与BufferedInputStream区别:FileInputStream是字节流,BufferedInputStream是字节缓冲流,
使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),
且FileInputStream对象的read方法会出现阻塞;
作者: 梁胜海    时间: 2013-4-1 13:44
带Buffered是有默认缓冲区,不容易在读大文件时丢数据。而且被Buffered装饰之后,发现copy一个大图片比不带Buffered速度快。你可以自己试试。当然我们可以自定义一个缓冲区数组。将要读的数据放到自定义数组中。建议在以后的开发中,使用Buffered。这时我写的BufferedReader的底层代码,并加上注释,自己看看就知道了。其实Buffered底层就是封装一组数组。

import java.io.IOException;
import java.io.Reader;

public class MyBufferReader {
        private Reader r;
        char[] buf=new char[1024];
        int index=0;//代表的是char数组的角标
        int count=0;//代表的是char数组的长度
        public MyBufferReader(Reader r) {
                this.r=r;
        }
       
        public  int myRead() throws IOException{
                //当数组长度变成零时,再取目标的文字放到数组中
                if(count==0){
                        count=r.read(buf);
                        index=0;//每次取完,将角标重置为零
                }
                //当文本中文字取完,返回-1.
                if(count<0){
                        return -1;
                }
                        //长度每次减1
                        count--;
                        //所取数组的角标增一
                        index++;
               
                return buf[index-1];
        }
        public String myReadLine() throws IOException{
                StringBuilder sb=new StringBuilder();
               
                int ch=0;
               
                while((ch=myRead())!=-1){
                        //因为在windows中换行是\r\n
                        if(ch=='\r'){
                                continue;//跳过到下一个再返回字符串
                        }
                        if(ch=='\n'){
                                return sb.toString();//到达行的末尾,返回字符串
                        }
                        sb.append((char)ch);//添加每次读取到的字符
                }
                //这里是以防出现没有换行
                if(sb.length()!=0){
                        return sb.toString();
                }
               
                return null;
        }
        //自定义关闭流
        public void myClose() throws IOException{
                r.close();
        }
}

作者: 胡滨    时间: 2013-4-1 17:39
FileInputStream/FileOutputStream
这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象)

BufferedInputStream和BufferedOutputStream
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。BufferedInputStream派生自java.io.FilterInputStream,并不是InputStream

作者: 庄生晓梦    时间: 2013-4-2 20:18
使用BufferedInputStream可以提高效率;FileInputStream是字节流,BufferedInputStream是字节缓冲流。使用BufferedInputStream读取资源是读取存储在内存中的数据;使用BufferedInputStream比FileInputStream读取资源效率高。
作者: 朱德帅    时间: 2013-4-2 22:47
用BufferedInputStream和FileInputStream说明一下。它们都是InputStream的子类,对于FileInputStream它包装了关于文件的功能,方便了对于文件的处理。对于BufferedInputStream它提供了缓冲的功能,对于读取效率会更好。对于普通的文本文件,或者小的文件都可以用FileInputStream去读,如果是一些大的文件要读取的话,建议用BufferedInputStream。这样会使读取更加快速。
作者: 王大斌    时间: 2013-4-3 01:24
这是我写的一些感受,你看看http://blog.csdn.net/wangdabin_1216/article/details/8749086
作者: 田磊阳    时间: 2013-4-3 22:18
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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