java io flush_《文件传输基础——Java IO流》,对其中flush方法的思考
在学习了《文件传输基础——Java IO流》 课程后,发现自己对flush()方法的调用有很多疑惑。在查询资料和自己看源码以及动手试验之后发现有以下几个特点。如有误也请大家指正出来,一切为了java,谢谢~
FileInputStream的 flush()是继承于其父类OutputStream的,但是OutputStream类的flush()什么都没做。
当OutputStream是BufferedOutputStream时,BufferedOutputStream中重写了flush()方法,并在其中调用了flushBuffer()方法以及OutputStream的flush()方法
public synchronized void flush() throws IOException {
flushBuffer();
out.flush(); //OutputStream
}
private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count); //OutputStream,buf是缓冲区
count = 0;
}
}
3.而在BufferedOutputStream中 缓冲区buffer其实就是一个byte[],BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。
public synchronized void write(byte b[], int off, int len) throws IOException {
if (len >= buf.length) {
/* If the request length exceeds the size of the output buffer,
flush the output buffer and then write the data directly.
In this way buffered streams will cascade harmlessly. */
flushBuffer();
out.write(b, off, len);
return;
}
if (len > buf.length - count) {
flushBuffer();
}
System.arraycopy(b, off, buf, count, len); //写入缓冲区
count += len;
}
4.那么什么时候才需要调用flush()呢?
举个例子:
public static void main(String[] args) throws IOException {
File demo = new File("demo");
if(!demo.exists()){
demo.mkdir();
}
File file = new File(demo, "raf.dat");
if(!file.exists()){
file.createNewFile();
}
PrintWriter pw = new PrintWriter(file);
String s = "";
for(int i = 0;i<2000;i++){
s="我是要写入到记事本文件的内容"+i;
pw.write(s);
}
pw.close();
}
在这段代码中,加了pw.close() ,可以完整的输出到“我是要写入到记事本文件的内容1999”。而不加pw.close(),在输出“我是要写入到记事本文件的内容1804”时,输出不完整了,1804接下来的字符串也被丢弃了(这是因为1804到1999这部分没有填满缓冲区)。如果将pw.close()替换成pw.flush()也可以进行完整的输出(这只是测试,正式使用时别忘了加将pw.close())。
也就是close()时会自动flush,在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush();
(这种情况适用于字节流:BufferedOutputStream,字符流的大部分Writer类(是不是全部我没有去验证),本质上只要在某类及其父类中有定义缓冲区的都适用。)
而FileOutputStream及其父类没有缓冲区,即在使用时不需要调用flush()。
感谢作者cmoaciopm 的博客《对OutputStream类的flush()方法的误解》给我带来的思路!
java io flush_《文件传输基础——Java IO流》,对其中flush方法的思考相关推荐
- 文件传输基础——Java IO流
一.文件的编码 1 package com.study.io; 2 3 4 /** 5 * 测试文件编码 6 */ 7 public class EncodeDemo { 8 9 /** 10 * @ ...
- Java Socket实现文件传输
阿里云双11服务器优惠(年度最佳优惠): A:1核2GB 1M 服务器年69元 B:1核2GB 1M 服务器三年180元 C:2核4GB 1~10M 服务器三年567元(强烈推荐) D:4核8GB 1 ...
- 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...
我有一个创建FTPS连接的CreateFTPConnection类.使用此连接传输文件.这里是TransferFile类的代码如何创建一个"FTPS"模拟服务器以单元测试Java中 ...
- java qq 传送文件_如何利用Java实现QQ文件传输功能.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > Java 如何利用Java实现QQ文件传输功能.pdf2页 本文 ...
- java学习笔记:零基础java学习路线+配套资料+书籍推荐
公众号菜鸟名企梦2018年,精品文章汇总: 01 我的秋招 我的秋招offer 我的offer选择 秋招全面总结-必读宝典 求职必读 02 零基础学习路线 零基础-java学习路线(上) 零基础-ja ...
- java io 创建文件夹_Java中Io流操作-File类的常用操作-创建文件,创建文件夹
package com.hxzy.IOSer; import java.io.File; import java.io.IOException; public class Demo03 { publi ...
- java线程删除文件,线程“main”java.io.jgitinernalexception中的异常:无法删除临时文件c:\users\13 dec...
我正在尝试使用jgit克隆git存储库. public static void main(String[] args) throws IOException, InvalidRemoteExcepti ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
- Java基于Socket文件传输示例
这个实例中的socket文件传输采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出流进行包装,加快传输的速度. 先来看服务器端的程序. 1.服务器端 import java.io.Buffere ...
最新文章
- 多项式加法C语言_只愿与一人十指紧扣_新浪博客
- LeetCode--046--全排列(java)
- Java社区领袖介绍平台支持选项
- 230. Kth Smallest Element in a BST ——迭代本质:a=xx1 while some_condition: a=xx2
- 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算案例二 | 计算 卷积 )
- 用户资源管理DBMS_RESOURCE_MANAGER
- QTP、LoadRunner、QC工具下载地址
- 42. 接雨水 golang
- 基于java员工管理系统设计(含源文件)
- php post请求 下载文件,POST请求 下载文件
- orange实现逻辑回归_逻辑回归模型
- 丹麦为NSA开绿灯 通过通信中心监控欧洲政客
- oracle快速创建可用用户
- windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
- 你家的猫也能来段东北话了:快手快影一键「智能配音」,三种方言随意换,还能配出《舌尖》风...
- 2022年PC必备的5款软件,功能强大且免费,你用过几个?
- BIOS int 10H中断介绍
- 怎样在python安装open cv_python 安装+open cv
- 安全分析--追踪溯源的找人思路
- LSTM-长短时记忆网络
热门文章
- OpenShift 4 - Pod的亲和性/反亲和性
- OpenShift 4 - 设置集群节点和Pod容器的时间和时区
- WPF:DataGrid可过滤、多语言
- Debian 26 岁生日快乐!Happy DebianDay!
- 实现机器学习的循序渐进指南V——支持向量机
- 初学者的持续集成和交付(DevOps)
- 谷歌开源 TensorFlow 的简化库 JAX
- php多个逻辑如何分为多个逻辑块,php 项目如何分层
- ad中那个快捷键是重复上一部_Excel中的F4快捷键用的好,告别加班没烦恼!
- ios 从服务器获取文件,ios - 如何将远程文件(从远程SMB服务器获取)提供给某些请求 - 堆栈内存溢出...