技术标签: Java基础-异常/IO/File/多线程-学习笔记 flush和close的区别
本篇来学习一个小的知识点,flush方法和close方法的区别。前面我们介绍了和使用了close方法,知道是用来关闭流的操作,但是并没有介绍flush方法,字面意思的刷新的意思。下面我们来先看看一个例子,然后引出flush方法。
1.如果不关闭流执行代码
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4_BufferCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");
FileOutputStream fos = new FileOutputStream("copy.war");
//创建缓冲区,对输入流进行包装
BufferedInputStream bis = new BufferedInputStream(fis);
//创建缓冲区,对输出流进行包装
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while ( (b = bis.read()) != -1) {
bos.write(b);
}
//关闭输入流缓冲区
//bis.close();
//关闭输出流缓存区
//bos.close();
}
}
执行上面代码,你可以对比copy.war文件的大小和jenkins.war区别,发现copy.war文件会比原文件jenkins.war要小一些。为什么会发生这个情况呢,答案就是在close方法了。在Eclipse中,查看close方法的源码如下:
@SuppressWarnings("try")
public void close() throws IOException {
try (OutputStream ostream = out) {
flush();
}
}
通过看close方法的源码,发现close方法里面包含一个flush方法。flush就是刷新缓冲区的功能,所以,我们可以总结close方法的作用或者特点是:具备刷新功能,在关闭流之前,就会先刷新一次缓存区,将缓冲区的字节全都刷新到文件上,再关闭流。这里,我们来解释下上面代码,没有close方法,也就是没有进行刷新操作,文件为什么会变小。文件变小,说明了还有一部分内容没有完成写入到文件。前面一篇,我们介绍了缓冲区默认大小是8192字节,上面文件在最后一次写入到文件的缓冲区里,里面字节数没有8192大小,所以不会触发自动写入操作,从而留下一部分字节没有写入到文件。只要文件不是8192字节的N倍大小,如果最后不进行close操作,肯定会丢失一部分数据。
2.用flush方法代替close方法
为了验证close方法包含flust,我们用flush方法代替close来进行测试下。
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4_BufferCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");
FileOutputStream fos = new FileOutputStream("copy.war");
//创建缓冲区,对输入流进行包装
BufferedInputStream bis = new BufferedInputStream(fis);
//创建缓冲区,对输出流进行包装
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while ( (b = bis.read()) != -1) {
bos.write(b);
}
//关闭输入流缓冲区
//bis.close();
//关闭输出流缓存区
//bos.close();
bos.flush();
}
}
如果你继续注销flush方法,还是发现拷贝之后文件变小。这里来总结下flush功能,主要就是刷新的作用,刷新完还可以继续写操作,这个典型的应用可以脑补下QQ即时聊天场景就好。
3.flush和close区别
简单来说,close包含flush功能,但是flush具备刷新完,还可以继续写操作,close执行完了就流关闭了,不能再写入,所以,不能用close来代替flush。为了证明这个结论,可以执行下面代码。
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4_BufferCopy {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\jenkins.war");
FileOutputStream fos = new FileOutputStream("copy.war");
//创建缓冲区,对输入流进行包装
BufferedInputStream bis = new BufferedInputStream(fis);
//创建缓冲区,对输出流进行包装
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while ( (b = bis.read()) != -1) {
bos.write(b);
bos.flush();
//bos.close();
}
//关闭输入流缓冲区
//bis.close();
//关闭输出流缓存区
//bos.close();
}
}
我在没一次写入文件操作后,里面执行刷新一次,当然这样写的后果就是拷贝执行过程太慢,耗时。但是如果这里尝试用close方法来代替flush,就会报已经关闭了流,不能再对流进行操作的错误。
文章浏览阅读1.6k次。Android中视图动画使用率越来越少了,很多大神都使用属性动画了。但个人觉得视图动画比属性动画使用起来更简单,所以能用视图动画实现的就不考虑用属性动画。 今天在项目中使用视图动画时,遇到了几个坑,记录下来,供踩到同样坑的同学参考一下~一、平移与缩放冲突 使用视图动画,常使用到动画集合AnimationSet,然后在动画集合中添加平移、绽放,旋转等动画。_android view有动画时执行invisible
文章浏览阅读4.6w次,点赞102次,收藏897次。Anaconda使用教程一(新手友好)前言一、python和包以及anaconda的概念关系关于python与包关于anaconda二、Anaconda安装问题对windows三、Anaconda使用问题配置Anaconda源可能出现的错误conda install 仍然出现下载速度慢的错误四、Anaconda创建虚拟环境并使用创建你的第一个环境查看当前conda所有环境激活你的环境在你的环境中用conda或者pip安装包查看环境中现有的包在环境中运行python程序(windows系统)退出当前环境删除环_anaconda使用教程
文章浏览阅读1k次。题意:求在一定l时间内看完n中电影中的m是否可能,若可能则最后快乐度是多少。之前错了好多遍,一直找不到原因,后来在百度上看了很多别人的代码发现只有初始化不同我的初始化: memset(f,0,sizeof(f));别人的: for(int i=0;i for(int j=0;j一开始认为没什么影响,但是苦于一直找不到原因,所以我将自_hdu - 3496
文章浏览阅读2k次。下面可以不看,一句话,为了其安全起见,以后我们就用SecurityRandom就好了。JDK中有两个随机数类。一个是PRNG,也就伪随机数类java.util.Random,是采用线性同余算法产生的。另一个是RNG,也就是java.util.Random的子类强随机数java.security.SecureRandom,这是一个SPI类,也就是说具体的算法由Pro..._securerandom和math.random()
文章浏览阅读8k次,点赞8次,收藏8次。npm安装vue报错npm ERR! code ETIMEDOUT_code etimedout
文章浏览阅读5k次。这两天用阿里云服务器重新部署网站服务器后,打开某php页面出现了如下警告:Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50547 Library:50631 in /XXX(某某目录)/wp-db.php on line 1520,虽然是警告,但是有的界面会因此打不开,无法..._mysql headers:50647
文章浏览阅读4.9w次。背景前两天写了一篇文章 OSX MAMP 如何为 PHP 5.6 安装 MSSQL 扩展,讲的是自己的个人电脑,也就是开发环境如何为 PHP 5.6 安装 MSSQL 扩展,现在要上生产了,继续讲讲怎么给 CentOS7 安装 PHP - MSSQL 扩展。运行环境操作系统CentOS Linux release 7.8.2003 (Core)集成环境宝塔PHP 5.6.40步骤和之前一样,我们先来整理一下整体的步骤:1、安装 freetds2、安装 mssql.so 扩展(p_宝塔面板centos7/php5.6安装mssql扩展
文章浏览阅读147次。这是交易 . 在我的Android应用程序中,我正在使用Jsoup进行一些网络抓取 . 现在它工作正常,但它太慢了 . 我在我的代码中做的是:通过Jsoup中的POST方法登录页面;获取cookie;通过重用cookie,我将浏览6页(POST和GET)并抓取它们(主要是表格和大量行 . 我的意思是很多......所以,真的很多foreach循环);将所有必需的数据写入SQLiteDatabase..._jsoup速度太慢
文章浏览阅读2.6k次。湖仓方案DeltaLake、Hudi、Iceberg功能对比_星环胡仓一体和hudi对比
文章浏览阅读3.7k次。编译 OpenCV打开终端进行编译:(-j 是使用 8 个线程进行编译,请根据你的计算机配置合理设置线程数)E:cd E:\opencv_341\opencv_mingw64_buildmingw32-make -j 8mingw32-make install如果 mingw32-make -j 8遇到错误,请看下面的 编译 OpenCV 常见错误,否则执行 mingw32-make..._m_pi' was not declared in this scope
文章浏览阅读2.7k次,点赞5次,收藏6次。Hilt 是 Android 的依赖注入库,是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。_hilt 使用 broadcastreceiver
文章浏览阅读97次。解压缩各种安装程序包文:tracky来源:http://bbs.hanzify.org/index.php?showtopic=24638&hl=点击:2578解压缩各种安装程序包1 微软的Installer制作的安装包,后缀一般是msi,mspA 可以用totalcmd 的msiplus插件,可以解压。不可以修改msi。B 可以用WinINSTALL LE 2003,在w..._php软件压缩包安装