A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何竹冬 中级黑马   /  2013-1-5 15:58  /  1698 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何竹冬 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
BufferedOutputStream的数据成员buf是一个位数组,默认为512字节。当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的OutputStream对象的write()方法,将buf数据写至目的地,而不是每次都对目的地作写入的动作。
建议每次write之后,要使用flush,而且每次写入的数据不要大于缓冲区范围,否则会失去缓冲流的优势。可以在构造时确定缓冲去的大小
回复 使用道具 举报
  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的空文件,没有什么问题。
回复 使用道具 举报
你在这里只是对数组操作一次,而第2次你的数据长度明显大于数组的长度,想一次读取成功必然是失败的。
两个方式解决吧,一种是足够大的数组,能解决问题,但基本上不推荐,因为根本没必要,也没办法知道想要传的文件有多大,不好操作;
第2种就是循环写入。
额,我没看到你的输入流,汗,你这是怎么写的,真心不懂,实在不行,你好歹也自己输入一点数据变成字节数组啊。
回复 使用道具 举报
本帖最后由 何竹冬 于 2013-1-5 20:08 编辑
黑马-王言龙 发表于 2013-1-5 18:28
根据你的代码我测试了一下,结果分别是10K和5K的空文件,没有什么问题。


你好,你注释了一行代码。
回复 使用道具 举报
何竹冬 发表于 2013-1-5 20:06
你好,你注释了一行代码。

那段代码没有用到,所有注释掉了
回复 使用道具 举报
黑马-王言龙 发表于 2013-1-5 21:54
那段代码没有用到,所有注释掉了

呵呵,不好意思,我写错了,用到那段代码了
回复 使用道具 举报
LZ  主要是因为BufferedOutputStream有缓存机制,而你在写入的时候没有达到缓存要求的长度,他为了效率是不会去读取的,这个时候你就必须手动提示他去读取。
特别是如果另一边是也是用BufferedReader的readLine()来读取的话
那么你这边的BufferedWriter就必须把      
br.write();
br.newLine();
br.flush;
这三代代码按顺序一起写,哪怕这个三行中随便有一句其他代码,都会导致他不会执行flush()方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马