黑马程序员技术交流社区

标题: 关于IO为什么结果完全不同 ? [打印本页]

作者: 何竹冬    时间: 2013-1-5 15:58
标题: 关于IO为什么结果完全不同 ?
本帖最后由 何竹冬 于 2013-1-6 13:40 编辑
  1. package cn.itcast.javabase;
  2. import java.io.*;
  3. /*
  4. 没有flush没有close,查看1.txt文件大小是10kb,写入成功。
  5. */
  6. public class Test
  7. {
  8. public static void main(String[] args) throws Exception
  9. {
  10. OutputStream out = new FileOutputStream("c:\\1.txt");
  11. byte[] buf = new byte[1024*10];
  12. BufferedOutputStream buffOut=new BufferedOutputStream(out);
  13. buffOut.write(buf);
  14. }
  15. }
复制代码
  1. package cn.itcast.javabase;
  2. import java.io.*;
  3. /*
  4. 没有flush没有close,发现1.txt0kb,写入失败
  5. */
  6. public class Test
  7. {
  8. public static void main(String[] args) throws Exception
  9. {
  10. OutputStream out = new FileOutputStream("c:\\1.txt");
  11. byte[] buf = new byte[1024*5];
  12. BufferedOutputStream buffOut=new BufferedOutputStream(out);
  13. buffOut.write(buf);
  14. }
  15. }
复制代码

作者: 黄锦成    时间: 2013-1-5 18:02
BufferedOutputStream的数据成员buf是一个位数组,默认为512字节。当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的OutputStream对象的write()方法,将buf数据写至目的地,而不是每次都对目的地作写入的动作。
建议每次write之后,要使用flush,而且每次写入的数据不要大于缓冲区范围,否则会失去缓冲流的优势。可以在构造时确定缓冲去的大小

作者: 黑马-王言龙    时间: 2013-1-5 18:28
  1. import java.io.*;

  2. /*
  3. 没有flush没有close,查看1.txt文件大小是10kb,写入成功。
  4. */
  5. public class DemoSE {
  6.         public static void main(String[] args) throws Exception {
  7.                 OutputStream out = new FileOutputStream("C:\\Users\\Melon\\Desktop\\DemoSE.java");
  8.                 byte[] buf = new byte[1024 * 10];
  9.                 //BufferedOutputStream buffOut = new BufferedOutputStream(out);//这段没用下面用的是out,而没用此buffOut
  10.                 out.write(buf);
  11.         }
  12. }
复制代码
根据你的代码我测试了一下,结果分别是10K和5K的空文件,没有什么问题。
作者: 肖志锋    时间: 2013-1-5 18:42
你在这里只是对数组操作一次,而第2次你的数据长度明显大于数组的长度,想一次读取成功必然是失败的。
两个方式解决吧,一种是足够大的数组,能解决问题,但基本上不推荐,因为根本没必要,也没办法知道想要传的文件有多大,不好操作;
第2种就是循环写入。
额,我没看到你的输入流,汗,你这是怎么写的,真心不懂,实在不行,你好歹也自己输入一点数据变成字节数组啊。
作者: 何竹冬    时间: 2013-1-5 20:06
本帖最后由 何竹冬 于 2013-1-5 20:08 编辑
黑马-王言龙 发表于 2013-1-5 18:28
根据你的代码我测试了一下,结果分别是10K和5K的空文件,没有什么问题。


你好,你注释了一行代码。
作者: 黑马-王言龙    时间: 2013-1-5 21:54
何竹冬 发表于 2013-1-5 20:06
你好,你注释了一行代码。

那段代码没有用到,所有注释掉了
作者: 何竹冬    时间: 2013-1-5 22:31
黑马-王言龙 发表于 2013-1-5 21:54
那段代码没有用到,所有注释掉了

呵呵,不好意思,我写错了,用到那段代码了
作者: 张森    时间: 2013-1-6 03:05
LZ  主要是因为BufferedOutputStream有缓存机制,而你在写入的时候没有达到缓存要求的长度,他为了效率是不会去读取的,这个时候你就必须手动提示他去读取。
特别是如果另一边是也是用BufferedReader的readLine()来读取的话
那么你这边的BufferedWriter就必须把      
br.write();
br.newLine();
br.flush;
这三代代码按顺序一起写,哪怕这个三行中随便有一句其他代码,都会导致他不会执行flush()方法




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