您的位置:首页 > 编程语言 > Java开发

java,write()方法后写flush()的作用

2016-05-02 10:01 441 查看
这个是缓冲区的问题.

java在使用流时,都会有一个缓冲区,按一种它认为比较高效的方法来发数据:把要发的数据先放到缓冲区,缓冲区放满以后再一次性发过去,而不是分开一次一次地发.

而flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满.

所以如果在用流的时候,没有用flush()这个方法,很多情况下会出现流的另一边读不到数据的问题,特别是在数据特别小的情况下.

java.io.OutputStream.flush() 方法刷新此输出流并强制将所有缓冲的输出字节被写出。刷新的常规协定是,调用它是一个迹象表明,如果以前写的任何字节都被缓冲的输出流的实现,如字节应立即写入到它们的目的地。

  此流的预期目标是由底层的操作系统,例如一个文件,然后刷新流保证提供了一个抽象只是先前写入的字节流传递给操作系统进行写入;它并不能保证他们实际上写的是一个物理设备,如磁盘驱动器。

  OutputStream中的flush方法不执行任何操作。

  下面的示例演示java.io.OutputStream.flush()方法的用法:

package com.yiibai;

import java.io.*;

public class OutputStreamDemo {

public static void main(String[] args) {
try {

// create a new output stream
OutputStream os = new FileOutputStream("test.txt");

// craete a new input stream
InputStream is = new FileInputStream("test.txt");

// write something
os.write('A');

// flush the stream but it does nothing
os.flush();

// write something else
os.write('B');

// read what we wrote
System.out.println("" + is.available());

} catch (Exception ex) {
ex.printStackTrace();
}

}
}

[/code]
将产生以下结果:2

FileStream.Flush 方法

.NET Framework 2.0

其他版本

清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。

命名空间:System.IO

程序集:mscorlib(在 mscorlib.dll 中)




异常

异常类型条件
IOException

发生 I/O 错误。

ObjectDisposedException

流已关闭。


备注

此方法重写
Flush。

除非显式地调用 Flush
Close,否则,刷新流不会刷新其基础编码器。将
AutoFlush 设置为 true 意味着将数据从缓冲区刷新到流中,但不刷新编码器状态。这将允许编码器保持其状态(不完全字符),以便它可以正确地对下一个字符块进行编码。此方案影响 UTF8 和 UTF7,这二者中,某些字符只能在编码器收到相邻的一个或多个字符后才能进行编码。

因为缓冲区可用于读取或写入,所以 Flush 执行以下两个功能:

以前写入缓冲区的任何数据都复制到文件中,并且缓冲区被清除(其编码器状态除外)。

如果
CanSeek 为 true 而且以前将数据从文件复制到缓冲区以进行读取,则文件内的当前位置会减少缓冲区中未读取的字节数。然后清除缓冲区。


示例
此代码示例是为
Lock 方法提供的一个更大示例的一部分。

VB

// Update the file.
case 'W':
try
{
fileStream.Seek(textLength,
SeekOrigin.Begin);
fileStream.Read(
readText, textLength - 1, byteCount);
tempString = new String(
uniEncoding.GetChars(
readText, textLength - 1, byteCount));
recordNumber = int.Parse(tempString) + 1;
fileStream.Seek(
textLength, SeekOrigin.Begin);
fileStream.Write(uniEncoding.GetBytes(
recordNumber.ToString()),
0, byteCount);
fileStream.Flush();
Console.WriteLine(
"Record has been updated.");
}

[/code]

J#

// Update the file.
case 'W' :
try {
fileStream.Seek(textLength, SeekOrigin.Begin);
fileStream.Read(readText,
textLength - 1, byteCount);
tempString = new String(uniEncoding.GetChars(
readText, textLength - 1, byteCount));
recordNumber = Int32.Parse(tempString)+1;
fileStream.Seek(textLength, SeekOrigin.Begin);
fileStream.Write(uniEncoding.GetBytes(
(new Integer( recordNumber)).ToString()),
0, byteCount);
fileStream.Flush();
Console.WriteLine("Record has been updated.");
}

[/code]


平台

Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求


版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:2.0、1.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: