黑马程序员技术交流社区

标题: 使用IO复制文件刷新问题 [打印本页]

作者: 吴琼    时间: 2012-6-28 13:46
标题: 使用IO复制文件刷新问题

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Copy_test {
/*
复制一个文件。其实复制文件就是连读带写的过程。首先定义一个读的流FileInputStream,再定义一个写的流FileOutputStream *
*/
public static void main(String[] args) throws IOException {
  FileInputStream fis = new  FileInputStream("c:\\3.wma");//C盘中有个音乐文件
  FileOutputStream fos =  new FileOutputStream("f:\\copy2.wma");//复制到f盘中.
//  byte[] ch =new byte [1024];
  int len;
  while((len = fis.read())!=-1){
   fos.write(len);
//   老师说不是读的过程中要刷新么,这里为什么不刷新呢?
//   fos.flush();这里不刷新也是可以的.
//还有高效率读的过程中(使用缓冲区)是不是不用刷新,刷新只在低效率的读取过程中需要刷新呢?
  }
  fis.close();
  fos.close();
}
}


作者: 李天甲    时间: 2012-6-28 13:53
我们在关闭的时候会执行刷新的..
所以这里不用考虑刷新也行.
事实上,你这读取完毕之后马上就关闭了,所以刷新和不刷新没有啥区别,虚拟机写到一定程度会自动刷新

但是如果你写完了马上又要回去读,这个之前需要刷新一下....
作者: 吴琼    时间: 2012-6-28 14:28
李天甲 发表于 2012-6-28 13:53
我们在关闭的时候会执行刷新的..
所以这里不用考虑刷新也行.
事实上,你这读取完毕之后马上就关闭了,所以刷 ...

我把关闭资源的都注释了 还是可以的....
作者: 陆强强    时间: 2012-6-28 14:28
这么讲吧,文本文件像txt,java都要刷新,纯字节型文件像音乐,图片可以不刷新。
文本文件不刷新会所有字打印在一行。
作者: 晁喆    时间: 2012-6-28 14:43
本帖最后由 晁喆 于 2012-6-28 14:49 编辑

首先,flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。

注意:OutputStream 的 flush 方法不执行任何操作。

其次:对于文件流来说,写入之后可以通过FileOutputStream.getFD().sync()方法强制操作系统同步刷新来解决flush刷新的不确定性。
该方法在同步刷新完成之后才会返回。

最后,在流对象被销毁时,将会先先调用flush方法,之后在进行close方法,所以对于流来说,是否刷新以及是否关闭都没有问题,但异常会导致不确定性,所以最好是显式的刷新以及finally关闭流。





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