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

这个是缓冲区的问题.
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();
      }


   }
}

将产生以下结果:2


FileStream.Flush 方法

.NET Framework 2.0

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

命名空间:System.IO
程序集:mscorlib(在 mscorlib.dll 中)


 
 

异常类型条件

IOException

发生 I/O 错误。

ObjectDisposedException

流已关闭。

此方法重写 Flush

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

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

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

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

示例

此代码示例是为 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.");
    }

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.");
    }

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
  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值