Java缓冲流细节
FileOutPutStream继承OutputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果。而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的。应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,每次等到缓冲区满了时,就将数据一次性整体写入设备,避免了每一个数据都和IO进行一次交互,IO交互消耗太大。
使用flush()和不使用flush()效果对比
不使用flush()
String s = "Hello World";
try {
// create a new stream at specified file
PrintWriter pw = new PrintWriter(System.out);
// write the string in the file
pw.write(s);
// // flush the writer
// pw.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
输出:
buffer没有满,输出为空。
使用buffer()
String s = "Hello World";
try {
// create a new stream at specified file
PrintWriter pw = new PrintWriter(System.out);
// write the string in the file
pw.write(s);
// flush the writer
pw.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
得到期望的输出结果。
解析
close()和flush()作用有交集!
public static void main(String[] args) {
BufferedWriter fw =null;
try {
fw = new BufferedWriter(new FileWriter("e:\\test.txt"));
fw.write("wo shi lucky girl.");
//fw.flush();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//fw.flush();这句有和无并不影响输出结果,不太明白词句是否必要?
因为close的时候,会把你没flush掉的一起flush掉。缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。在这个例子中,flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出
Java默认缓冲区大小是多少?
默认缓冲去大小8192字节。
实验
char[] array = new char[8192];
Arrays.fill(array,'s');
PrintWriter pw = new PrintWriter(System.out);
pw.write(array);
output: char[] array = new char[8193];
Arrays.fill(array,'s');
PrintWriter pw = new PrintWriter(System.out);
pw.write(array);
output:
ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss..一共8193个s...sssssssssssssssssssssssssssssssssssssssssssssss
当设置数组长度为8192时没有输出,设置8193时有输出。
经典问题
数据重复问题
Java缓冲流细节的更多相关文章
- java 缓冲流 Buffer
缓冲流 Buffer :设置缓冲区加快执行效率 子类: (一)BufferedInputStream : 缓冲输入字节流 ,目的:提高读取文件的效率 注意: BufferedInputStream ...
- Java缓冲流高效大文件的复制实例
public class BufferedDemo { public static void main(String[] args) throws FileNotFoundException { // ...
- Java缓冲流的优点和原理
不带缓冲的流的工作原理: 它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了. 带缓冲的流的工作原理: 读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从 ...
- java 缓冲流
english.txt The arrow missed the target. They rejected the union demand. Where does this road go to? ...
- Java缓冲流写出数据实例
public class BufferedWriterDemo throws IOException { public static void main(String[] args) throws I ...
- java的 IO流之缓冲流(转载)
java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来 ...
- java IO之 File类+字节流 (输入输出 缓冲流 异常处理)
1. File类
- JAVA基础学习day20--IO流二-缓冲流、字节流
一.缓冲流 1.1.字符流的缓冲区 缓冲区的出现是为了提高IO的读写效率 对应类 BufferedReader BufferedWriter 缓冲区要结合流才可以使用 在流的基础上对流的功能进行了增强 ...
- java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...
随机推荐
- 码农谷 求前N项之和
题目描述 有一分数序列:2/1.3/2.5/3.8/5.13/8.21/13.......求出这个数列的前N项之和,保留两位小数. 输入描述 N 输出描述 数列前N项和 样例 输入: 输出: 16.4 ...
- 简单linux块设备驱动程序
本文代码参考<LINUX设备驱动程序>第十六章 块设备驱动程序 本文中的“块设备”是一段大小为PAGE_SIZE的内存空间(两个扇区,每个扇区512字节) 功能:向块设备中输入内容,从块设 ...
- ADO .NET 链接 增删改查
ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连 ...
- c#中执行多条sql语句【ORA-00911: 无效字符】
问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...
- zookeeper典型应用场景之一:master选举
对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...
- 在xml中调用自己用java代码定义的View
1.在res中new一个class继承view.View,重写ondraw方法,写出自己的view package com.zzw.myView; import android.content.Con ...
- 通过Messenger与后台连接(单向操作,activity向service发送数据)
xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- uboot启动流程
uboot 的启动过程及工作原理2.1 启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅 ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Android无法连接adb的解决方法
今天在折腾乐蛙时发现无法链接ADB了,但是手机却显示USB调试模式! 然后想起了大蛋曾经告诉我CM的解决方法,于是你懂得,俺差点就把菊花给卖了呢(/Д`)~゚。 adb shell rm -r /da ...