这个方法N多人调用,机会大部分人都认为flush后,其他用户应该立即可见,直到一个小时以前我也是这样认为的。但是在一些极端的情况下也需调用后还是无法看见以写入的数据。
什么原因?先看看API中flush是如何描述的:
flush
刷新此输出流并强制写出所有缓冲的输出字节。flush
的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
OutputStream
的 flush
方法不执行任何操作。
为什么会这样? 原因是,这个缓冲我们java自己实现的。 flush保证的是内部的缓冲写入到系统中。但是系统中文件也可能有缓冲,所以并不一定flush后立即可见。
那么如何解决这个问题?在文件流或数据流中均可以看见getFD()这个方法, 它返回的是与此流有关的文件描述符。
所以调用文件描述符的sync的方法即可让实际文件强制同步了。JDK中描述如下:
sync
强制所有系统缓冲区与基础设备同步。该方法在此 FileDescriptor 的所有修改数据和属性都写入相关设备后返回。特别是,如果此
FileDescriptor 引用物理存储介质,比如文件系统中的文件,则一直要等到将与此 FileDesecriptor
有关的缓冲区的所有内存中修改副本写入物理介质中,sync 方法才会返回。 sync
方法由要求物理存储(比例文件)处于某种已知状态下的代码使用。例如,提供简单事务处理设施的类可以使用 sync
来确保某个文件所有由给定事务造成的更改都记录在存储介质上。 sync 只影响此 FileDescriptor 的缓冲区下游。如果正通过应用程序(例如,通过一个
BufferedOutputStream 对象)实现内存缓冲,那么必须在数据受 sync 影响之前将这些缓冲区刷新,并转到 FileDescriptor
中(例如,通过调用 OutputStream.flush)。
这就是原因所在了... 基础太弱鸟!!
分享到:
相关推荐
具体来说,在客户端与服务器之间传输文件时,通常会使用输入流从文件中读取数据,并使用输出流将这些数据写入到网络或磁盘中。 - **输入流** (`InputStream`): 用于从源读取二进制数据。 - **输出流** (`...
文件输入流(FileInputStream)和文件输出流(FileOutputStream)是Java.io包中的核心类,分别用于读取和写入文件。它们继承自抽象基类InputStream和OutputStream,形成Java I/O流体系结构的一部分。流可以理解为...
- **读取响应结果**:从输入流中读取服务器返回的数据,并处理这些数据。 ### 2. HttpURLConnection 类详解 `HttpURLConnection`是Java中的一个内置类,用于处理HTTP协议相关的网络通信。它继承自`URLConnection`...
输入流用于从数据源(如文件、网络连接)读取数据,输出流则用于将数据写入目标(如文件、网络连接)。Java中,这两个概念被进一步细分为字节流和字符流。 1. 字节流: - 字节输入流(Byte Input Stream)的基类是...
- **输入流**:主要用于从数据源读取数据。输入流只能从中读取数据,而不能向其中写入数据。例如,`FileInputStream`用于从文件中读取字节数据。 - **输出流**:主要用于向目的地写入数据。输出流只能向其中写入数据...
IO 流可以按照不同的方式分类,一种是按照流的方向分类,分为输入流和输出流。输入流用于从外部设备读取数据,而输出流用于将数据写入到外部设备。另一种分类方式是按照流的数据单位不同,分为字节流和字符流。字节...
3. 打开:在Java中,打开文件通常涉及到输入/输出流。`FileInputStream`和`FileOutputStream`用于读写文件,而`BufferedReader`和`BufferedWriter`等类可以提供缓冲,提高读写效率。此外,`FileReader`和`FileWriter...
在Hadoop中,我们主要关注与文件操作相关的`FSDataInputStream`和`FSDataOutputStream`,它们分别代表了HDFS的输入流和输出流。这两个类继承自Java的`InputStream`和`OutputStream`,并增加了对HDFS操作的支持。 1....
在 Java 编程中,输出流和输入流是非常重要的概念,它们分别负责将数据写入到外部设备或文件中和从外部设备或文件中读取数据。在 Java 中,输出流和输入流都是基于流(Stream)概念的,流是指一种可以顺序读取或写入...
- `new FileInputStream(new File(imagePath))`:创建文件输入流,用于读取指定路径下的图片文件。 - `response.getOutputStream()`:获取服务器端的输出流,用于向客户端输出数据。 ##### 3.3 数据读取与输出 ```...
而输入流则是一端无限,另一端通过读指针从流中读取内容并删除的单向流。 在C++中,有几种常见的流对象: 1. 输入流对象 `cin` 与标准输入设备(通常为键盘)相连。 2. 输出流对象 `cout` 与标准输出设备(通常为...
1. **`fstream`库**:`fstream`库是C++ I/O系统的一部分,它包含三个主要的类——`ifstream`(输入文件流)、`ofstream`(输出文件流)和`fstream`(输入/输出文件流)。这些类继承自`iostream`,并扩展了对文件操作...
文件流分为两种类型:输入流(Input Stream)用于从文件读取数据,输出流(Output Stream)用于向文件写入数据。在C++中,文件流主要通过iostream库实现,包括ifstream(输入文件流)、ofstream(输出文件流)和...
##### 2.2 文件输入流 文件读取是通过创建一个`BufferedInputStream`对象完成的,该对象包装了一个`FileInputStream`实例: ```java InputStream ins = new BufferedInputStream(new FileInputStream(rootPath + ...
例如,FileInputStream类是用于从文件读取字节的输入流,可以通过文件路径、File对象或FileDescriptor对象进行初始化。而ByteArrayInputStream则允许我们从一个字节数组中读取数据。 对于输出流,OutputStream类是...
Java中的输入输出流(IO流)是编程中用于处理数据传输的关键部分,特别是在处理文件、内存数据、网络通信等场景。在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。 1. **字节流与...
2. **创建缓冲输入流**:将`FileInputStream`包装到`BufferedInputStream`中,以实现高效的读取操作。 3. **打开目标文件**:使用`FileOutputStream`创建一个输出流,指向复制的目标文件。 4. **创建缓冲输出流**:...
Java输入输出流是Java编程语言中的核心概念,用于在程序之间、程序与文件系统、网络连接等不同数据源之间传输数据。在这个主题中,我们将深入探讨Java输入输出流的使用,通过具体的代码示例帮助你理解和掌握这个关键...
* read(字节数组):从输入流中读取数据到字节数组中 * a)中间容器 byte[] flush = new byte[长度] * b)接收长度 int len = 0 * c) 循环读取 while (-1 != (len = 流.read(flush))) * d)操作输出、拷贝 b) 输出...
4. 关闭流:使用 `close` 方法关闭文件输入流和输出流,以释放系统资源。 示例代码 以下是一个简单的 Java 文件复制粘贴示例代码: ```java package com.util; import java.io.FileInputStream; import java.io....