`

文件系统输入流中的flush

    博客分类:
  • java
阅读更多

这个方法N多人调用,机会大部分人都认为flush后,其他用户应该立即可见,直到一个小时以前我也是这样认为的。但是在一些极端的情况下也需调用后还是无法看见以写入的数据。

 

 

什么原因?先看看API中flush是如何描述的:

flush

刷新此输出流并强制写出所有缓冲的输出字节flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标

 

如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。

 

      OutputStreamflush 方法不执行任何操作。

 

为什么会这样? 原因是,这个缓冲我们java自己实现的。 flush保证的是内部的缓冲写入到系统中。但是系统中文件也可能有缓冲,所以并不一定flush后立即可见。

 

那么如何解决这个问题?在文件流或数据流中均可以看见getFD()这个方法, 它返回的是与此流有关的文件描述符

所以调用文件描述符的sync的方法即可让实际文件强制同步了。JDK中描述如下:

 

sync

强制所有系统缓冲区与基础设备同步。该方法在此 FileDescriptor 的所有修改数据和属性都写入相关设备后返回。特别是,如果此 FileDescriptor 引用物理存储介质,比如文件系统中的文件,则一直要等到将与此 FileDesecriptor 有关的缓冲区的所有内存中修改副本写入物理介质中,sync 方法才会返回。 sync 方法由要求物理存储(比例文件)处于某种已知状态下的代码使用。例如,提供简单事务处理设施的类可以使用 sync 来确保某个文件所有由给定事务造成的更改都记录在存储介质上。 sync 只影响此 FileDescriptor 的缓冲区下游。如果正通过应用程序(例如,通过一个 BufferedOutputStream 对象)实现内存缓冲,那么必须在数据受 sync 影响之前将这些缓冲区刷新,并转到 FileDescriptor 中(例如,通过调用 OutputStream.flush)。

 

这就是原因所在了... 基础太弱鸟!!

分享到:
评论

相关推荐

    文件输入输出流(总概)

    NULL 博文链接:https://pichcar.iteye.com/blog/316478

    java中实现复制文件和文件夹

    // 新建文件输入流并对它进行缓冲 FileInputStream input = new FileInputStream(sourceFile); BufferedInputStream inBuff=new BufferedInputStream(input); // 新建文件输出流并对它进行缓冲 ...

    用C++实现简单的文件IO操作

    现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "和">>" 比较熟悉了, 因为你接下来还要用到他们。继续…  二、ASCII 输入  输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件...

    SA-FileUp 文件上传

    来自Software Artisans,SA-FileUP组件是一个真正的ActiveX DLL服务器组件,容易集成到ASP网页中。该组件也可在MTS/COM+的环境中上运行。...当你不想保存任何东西的时候,可以用它来放弃全部的输入流。

    IO输入输出体系.rar

    需要即时写入的时候 调用 flush()方法,手动刷新缓冲流 注意 关闭流的时候也会自动刷新缓冲流中的数据 字节流转换为字符流 InputStreamReader(System.in) 适配器模式的使用 其意图是将一个类的接口转换成客户希望...

    strust文件上传

    我就不多说了,都是用输入流进行先读,然后用输出流去写,唯一不同的是我用的是缓冲输入输出流 byte[] buffer = new byte[8192]; while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) { bos.write(buffer, 0,...

    python面向对象day01.txt

    打开函数 open() 返回的文件流对象 文件流对象的方法: F.read F.readline F.readlines F.write F.writelines F.close() F.flush() 清空缓冲区(缓冲区的概念) F.tell() 得到文件的当前读写位置 F.seek...

    Android 上传文件工具类

    // 允许输入流 conn.setDoOutput(true); // 允许输出流 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); // 请求方式 conn.setRequestProperty("Charset", CHARSET); // ...

    java文件上传程序.doc

    //获取连接此输入流的地址 address = socket.getInetAddress(); //返回ip ip = address.getHostAddress(); dis = new DataInputStream(is); //读取上传过过来的文件名 String fileName = dis.readUTF(); System.out...

    桌面管家源码(java)

    //文件输入流 public FileInputStream fis=null;//文件输出流 byte[] buf; public int patch,patch1; link(){} //创立连接 public void Screateconnect() { try { serversocket=new ServerSocket(9999);...

    用poi创建Excel文件

    //在单元格中输入一些内容 //创建一输出文件流 FileOutputStream fOut=new FileOutputStream(outputFile); // 把相应的Excel 工作簿存盘 workbook.write(fOut); fOut.flush(); // 操作结束,...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    编辑word模板时,${string} 标签最好是手动一次性输入完毕,或者使用记事本统一将整个${string}编辑好之后,粘贴至word里边。 也就是说,不要在word里首先打完 ${ } 之后,又从其它地方把 string 字符串粘贴至 { } ...

    POI导入导出EXCEL文件.(struts 1.x and struts2.x).doc

    web中使用POI导入导出EXCEL文件的例子 struts1.x的例子,struts2.x可以参考自己修改 1.action的写法 import java.io.*; import java.sql.*; import java.util.ArrayList; import javax.servlet....

    ssh(structs,spring,hibernate)框架中的上传下载

    //将某个文件的文件数据写出到输出流中 6. String getFileName(String fileId);//获取文件名 7. }  其中save(FileActionForm fileForm)方法,将封装在fileForm中的上传文件保存到数据库中,这里我们使用...

    计算机网络实验报告 获取MAC socket通信

    // 接受网络输入流 写入文件 int len = 0; byte[] buff = new byte[1024]; while((len=is.read(buff))!=-1){ fos.write(buff, 0, len); fos.flush(); } } catch (FileNotFoundException e) { //...

    c# 加密和解密相关代码

    在第一个GroupBox 中放入3 个TextBox 控件和一个Button 按钮,分别用于输入数字、输入加密数字、显示加 密后的数字和计算加密信息;在第二个GroupBox 中放入一个TextBox 控件和一个Button 按钮,分别用于显示 解密后...

    服务器下载文件

    System.out.println("--输入流--:"+fis); System.out.println("----"); System.out.println("--------"); file_unique = new String(file_unique.getBytes(), "ISO-8859-1"); System.out.println("--下载文件...

    C#全能速查宝典

    1.1.5 Console类——控制台中的输入流、输出流和错误流 6 1.1.6 Convert类——类型转换 8 1.1.7 常量——值不改变的量 9 1.1.8 Dispose方法——释放资源 10 1.1.9 迭代器——相同类型的值的有序序列的一段代码 10 ...

    java 面试题 总结

    动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的...

    FTP服务器 C#

    // 分解客户端发来的控制信息中的命令和参数 string command = receiveString; string param = string.Empty; int index = receiveString.IndexOf(' '); if (index != -1) { command = receiveString....

Global site tag (gtag.js) - Google Analytics