关于java的flush

java中在write()方法后尽量手动调用flush()方法,原因呢:
这里首先应该对I/O对计算机体系结构要有一个简单的了解,计算机分为运算器、控制器、存储器、输入/输出。cpu由运算器、控制器和寄存器等等组成。存储器分为内存和外存,这里简单说一下I/O。
I/O主要是对外存的读/写,而cpu的速度远远大于I/O,此时就有很多策略解决,这时将数据加入缓冲区是一个高效的方法,这样减少了cpu的I/O次数,提高运行效率,但是read()和write()是线程阻塞的,当某个线程向另一网络节点读写数据时,当发生网络连接异常或服务器短暂无响应,这会发生线程阻塞,同样在无数据进行读取或者数据已满进行写操作时,同样会发生阻塞,这是其他线程抢占资源,缓冲区的数据不能及时输送需要等到竞争到cpu时间才可以发送,还有一种策略是当缓冲区长度满了以后才会将缓冲区发送,这样,若到了文件末尾往往会因为缓冲未满导致数据未发送,此时在write()后手动调用flush(),这样手动强制将数据发送,不会有数据滞留在缓冲区中,这种事情会经常发生,应该注意再次特做笔记。

这里就有之前碰到的例子:数据在缓冲中滞留https://blog.youkuaiyun.com/small__snail__5/article/details/87196948

Java 中,`flush()` 方法用于强制将缓冲区中的数据写入目标资源(如文件、网络连接等),并清空缓冲区。这对于确保数据及时写入目标非常重要,尤其是在程序结束或流关闭之前。 ### 示例 1:使用 `BufferedWriter` 的 `flush()` 方法 ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class FlushExample { public static void main(String[] args) { try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { writer.write("这是缓冲的数据"); writer.flush(); // 强制将数据写入文件 } catch (IOException e) { e.printStackTrace(); } } } ``` 在此示例中,调用 `flush()` 确保写入的内容立即保存到文件中,而不是等待缓冲区满或流关闭时才写入 [^3]。 ### 示例 2:使用 `PrintStream` 的 `flush()` 方法 ```java import java.io.FileOutputStream; import java.io.PrintStream; public class PrintStreamFlushExample { public static void main(String[] args) { try (PrintStream ps = new PrintStream(new FileOutputStream("log.txt"))) { ps.println("日志信息"); ps.flush(); // 确保数据立即写入文件 } catch (Exception e) { e.printStackTrace(); } } } ``` 在此示例中,`PrintStream` 通常会自动刷新,但调用 `flush()` 可以确保输出缓冲区的内容立即写入目标文件 [^1]。 ### 示例 3:使用 `BufferedOutputStream` 的 `flush()` 方法 ```java import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStreamFlushExample { public static void main(String[] args) { try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("data.bin"))) { bos.write("二进制数据".getBytes()); bos.flush(); // 强制将缓冲区内容写入文件 } catch (IOException e) { e.printStackTrace(); } } } ``` 此代码演示了如何通过 `flush()` 方法确保所有缓冲数据写入底层输出流 [^1]。 ### 示例 4:手动管理缓冲区的 `flush()` 使用场景 当自定义缓冲逻辑时,可以结合 `flush()` 实现更精细的控制: ```java import java.io.OutputStream; import java.io.ByteArrayOutputStream; class CustomOutputStream extends OutputStream { private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); @Override public void write(int b) throws IOException { buffer.write(b); } public void flush() throws IOException { // 自定义刷新逻辑,例如发送数据到网络 System.out.println("刷新缓冲区: " + buffer.toString()); buffer.reset(); // 清空缓冲区 } } public class CustomFlushExample { public static void main(String[] args) { try (CustomOutputStream cos = new CustomOutputStream()) { cos.write("测试数据".getBytes()); cos.flush(); // 手动触发刷新 } catch (IOException e) { e.printStackTrace(); } } } ``` 该示例展示了如何实现一个自定义的 `OutputStream` 并使用 `flush()` 来控制缓冲区的行为 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值