黑马程序员技术交流社区

标题: 新人,问题,求解 [打印本页]

作者: jian叫兽    时间: 2014-12-27 11:15
标题: 新人,问题,求解
为什么字节流不需刷新(没用缓冲器)就能录入数据,而字符流要刷新?


作者: 忆墨    时间: 2014-12-27 12:03
跟方法有关
作者: 西风烈123    时间: 2014-12-27 12:06
跟方法有关确实
作者: jian叫兽    时间: 2014-12-27 12:08
忆墨 发表于 2014-12-27 12:03
跟方法有关

可否详解?
作者: jian叫兽    时间: 2014-12-27 12:10
西风烈123 发表于 2014-12-27 12:06
跟方法有关确实


请详解
作者: 忆墨    时间: 2014-12-27 12:27
忆墨 发表于 2014-12-27 12:03
跟方法有关

你必须明确一个概念,缓刷新的概念是针对于内存缓冲的,就是说只有在涉及缓冲区的操作时才会 用到刷新,而在java中

字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。


         

作者: 忆墨    时间: 2014-12-27 12:34
忆墨 发表于 2014-12-27 12:27
你必须明确一个概念,缓刷新的概念是针对于内存缓冲的,就是说只有在涉及缓冲区的操作时才会 用到刷新, ...

另外说一点,你就明白了,为什么我们在java中用的大多IO操作都是选用字节流
一方面是因为,大部分的文件(音频,视频都是采用字节存储的)
另一方面:字节的操作时不通过内存缓冲区的(不像字符一样要先缓存到内存中,再到内存中对数据操作,这样使得CPU频繁的访问内存, 会导致程序运行的速率),所以字节操作的效率是要高于字符操作的 。
所以,说了这么多,明白吗?
作者: jacoblx    时间: 2014-12-27 13:17
忆墨 发表于 2014-12-27 12:34
另外说一点,你就明白了,为什么我们在java中用的大多IO操作都是选用字节流
一方面是因为,大部分的文件 ...

我觉得使用缓冲区才能提高效率吧,内存的速度比外存快多了呀。复制一个文件不用缓冲区(就是读一个字节,写一个字节)能慢死,而使用缓冲区就会快很多,比如使用BufferedReader或者自己定义数组,你可以试试。
作者: 寻觅    时间: 2014-12-27 13:26
有没有人能给个最终的无可厚非的答案,我也想知道
作者: yninggis    时间: 2014-12-27 14:39
jacoblx 发表于 2014-12-27 13:17
我觉得使用缓冲区才能提高效率吧,内存的速度比外存快多了呀。复制一个文件不用缓冲区(就是读一个字节, ...

这里说的缓冲区有两个层面吧?
第一个:相对字节流而言,字符流有缓冲区的技术;
第二个:字符流的BufferedReader技术;

效率对比:
第一个情况中,字符流使用了缓冲技术,所以比字节流效率低;
第二个情况中,使用了BufferedReader技术,可以提高了字符流操作的效率;

总结:应该从两个层面来讲
1、相对于字节流而言,字符流效率稍低,因为用了缓冲区,需要不断的访问内存中的什么编码表;
2、BufferedReader技术是在字符流的基础上,读完多个字符,再同时写多个字符,减少对硬盘(或其他输入输出目的)的读写操作,效率上就提高了。


以上,不到之处,请指正!
作者: Hello_Boys    时间: 2014-12-27 15:01
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的 字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
作者: Gyx    时间: 2014-12-27 15:05
字符流两个基类:
        Reader读
        Writer写
        FileReader读文件
        FileWriter写文件
用FileWriter文件创建的文件,没有就创建,有的话被覆盖!
文件的续写后面加上true
用FileReader与硬盘上的文件关联。用read读取。

缓冲区:
        BufferedReader读缓冲区
        BufferedWeiter写缓冲区
它的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
缓冲区提供的方法:newLine()换行符方法。
字节流:
        InputStream读取流
        OutputStream写入流
        BuffereInputStream
        BuffereOutputStream
字节流写入数据:fos.write("ajdhas".getBytes());
available()获取文件里面长度大小
在数据不是太大的情况下可以使用
        byte[] buf=new byte[fis.available()];
        fis.read(buf);
        System.out.println(new String(buf));
数据过大可以使用:
        byte[] buf=new byte[1024];
        int ch=0;
        while((ch=fis.read(buf))!=-1)
        {
                System.out.println(new String(buf,0,ch));
        }
作者: Gyx    时间: 2014-12-27 15:07
希望能够帮到你!加油!




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