通过调试偶然间发现在使用字符流写文件时如果写操作完成后不调用close方法,生成的文件为空;而使用字节流写文件,写完后不调用close,文件生成无异常,为什么会这样?对此我感觉很奇怪。
        JVM对字节流和字符流的处理到底有哪些不同?        望前辈指教。

解决方案 »

  1.   

    字节流不使用缓冲区,不用close流直接就写入了,而字符流使用了缓冲区,不手动close不会写入内容。
      

  2.   

    关于字符流:
    1。调用flush方法,刷新缓存到文件。
    2。调用close方法,刷新缓存到文件,且关闭流
      

  3.   

    楼上的观点和我的一样那问题就变成是不是怎么判断是否用到缓存。当然更简单的办法就是规范编程。
    http://blog.csdn.net/sdojqy1122/article/details/7247920
    这里面提到一点。有兴趣的可以看一下。
      

  4.   

    实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。有些书上说,调用close方法,会自动调用flush方法,刷新缓存。
      

  5.   

    BufferedOutputStream 也是字节流。
      

  6.   

    字节流在操作的时候是直接与文件本身关联,不使用缓冲区,字节直接存到文件中;字符流在操作的时候是通过缓冲区与文件操作,字符到缓冲区然后再到文件中,所以字符流中存在一个flush()方法来刷新缓冲区,调用close方法,会自动调用flush方法,刷新缓存。
    一般来说,在传输或者在硬盘上保存的内容是以字节的形式存在的,所以字节流的操作较多,但是在操作中文的时候字符流比较好用。
      

  7.   

    以前也遇到过没有使用close导致没有数据的情况,现在才知所以然 
      

  8.   


    直接用FileOutputStream写的,估计不用缓冲流类就不会出异常,还没来得及验证,晚上再测试一下
      

  9.   

    http://topic.csdn.net/u/20120528/00/6f95d429-0851-46ac-839e-2040dc058186.html?seed=1599200075&r=78697075#r_78697075
    帮帮忙看一下……
      

  10.   



        刚作了许多测试发现不使用Buffered类的都可以正常完成读写操作,使用Buffered的如果文件很小,有可能数据只残留在缓存区而都不输出;要是文件较大,则一小部分残留在缓存区。
        以上是我根据通过对几个相关类调试结果的分析得出的推断,不知正确与否。希望对JAVA内存调度机制有定量的认识的大牛多多指教,能给同样存在此疑问的JAVA爱好者一个确定的,详细的解答,谢谢!