缓冲流(Buffered)
发布时间:2025-05-25 07:17:05 发布人:远客网络
一、缓冲流(Buffered)
缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
BufferedoutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedoutputStream(OutputStream out,int size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
int size:指定缓冲流内部缓冲区的大小,不指定默认
1.创建FiLeOutputstream对象,构造方法中绑定要输出的目的地
2.创建BufferedOutput stream对象,构造方法中传递FileOutputStream对象对象,提高FileOutputStream对象效率
3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据,第4步可以省略)
int read()从输入流中读取数据的下一个字节。
int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
void close()关闭此输入流并释放与该流关联的所有系统资源。
BufferedInputStream(InputStream in)创建一个BufferedInputStream并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in,int size)创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流
我们可以传递FileInputstream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率int size:指定缓冲流内部缓冲区的大小,不指定默认
1.创建FileInputStream对象,构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputstream对象的读取效率
3.使用BufferedInputstream对象中的方法read,读职文件
利用缓冲流复制文件,大大提高速度
java.io.Buffereduriter extends Writer Buffereduriter:字符缓冲输出流
-void write(int c)写入单个字符。
void write(char[]cbuf)写入字符数组。
abstract void write(char[]cbuf,int off,int Len)写入字符数组的某一部分,off数组的开始索引,Len写的字符个数。
void write(String str)写入字符串。
void write(String str,int off,int Len)写入字符串的某一部分,off字符串的开始索引,Len写的字符个数。
void flush()刷新该流的缓冲。
-void close()关闭此流,但要先刷新它。
Buffereduriter(uriter out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
Buffereduriter(writer out,int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
我们可以传递Filewriter,缓冲流会给Filewriter增加一个缓冲区,提高Filewriter的写入效率int sz:指定缓冲区的大小,不写默认大小
void newline()写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符换行:换行符号
1.创建字符缓冲输出流对象,构造方法中传递字符输出流
2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
java.io.BufferedReader extends Reader继承自父类的共性成员方法:
int read()读取单个字符并返回。
int read(char[]cbuf)一次读取多个字符,将字符读入数组。
void close()关闭该流并释放与之关联的所有资源。
BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in,int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
我们可以传递FiLeReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率特有的成员方法:
string readline()读取一个文本行。读取一行数据行的终止符号:通过下列字符之一即可认为某行已终止:换行(‘\n')、回车(\r')或回车后直接跟着换行(\r\n)。
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null
1.创建字符缓冲输入流对象,构造方法中传递字符输入流
2.使用字符缓冲输入流对象中的方法read/readLine读取文本
二、java 输入输出流 (被采纳为答案者加100分)
其中BufferedInputStream是FileInputStream的子类,你可以理解成同样处理一个文件,BufferedInputStream效率更高,原因是BufferedInputStream采用了更高效的字节流处理方式,
BufferedInputStream才用缓冲流把内在的缓冲器连接到I/O流,允许java程序对多个字节同时操作,这样就提高了效率。
inputstreamreader的构造函数带两个参数,一是关联到的文件,二是字符解码方式.所以实际上通过inputstreamreader实例读出来的东西已经不是磁盘上原始的字节数据了,而是根据你指定的解码方式(如果你没有指定,则使用系统缺省的,win2000下是gbk/gb2312)把字节流转换成了字符流,注意字节流和字符流的区别,一个字节就是8比特位(32位机器上),而一个字符含多少字节则与不同的编码/解码方式有关了,如gbk是一字节,utf-8是1-3的变长字节,utf-16是2个定长字节.
于是值得你注意的就是当你用inputstreamreader读文件时,你应该知道该文件被存储时是用什么方式编码的,否则你指定错了解码方式,读出来的就是乱码.但是退一步来说,在全英文环境下,问题也没这严重.因为所有的字符集在前七位上都是与ascii兼容的(我猜的,也许有的不是),然而当你的程序涉及中文字符时,肯定是会出错了.
那么fileinputstream的特点呢?它的构造函数就一个,即关联到的文件,既然没有指定解码方式,那它所做的就是只以字节流的方式读出文件而不做任何处理,你应该用一个字节数组来接受它,对该数组你以后还可以做任何想做的操作。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
/* public static void main(String[] args){
String str=new String("Face recognition in the thermal infrared domain has received relatively little attention in the literature in comparison with recognition in visible-spectrum imagery");
StringTokenizer token=new StringTokenizer(str);
Hashtable ht=new Hashtable();
while(token.hasMoreTokens()){
String temp=new String(token.nextToken());
System.out.print("KEY_NO:"+obj);
System.out.println("="+ht.get(obj));
public static void main(String[] args){
String file1="d:\\1.doc";
String file2="d:\\2.doc";
//fileCheck("d:\\test1.txt");
// readFile("D:\\test1.txt");
// readFileByte("D:\\test1.txt");
// readFileByFile("D:\\test1.txt");
// TODO Auto-generated catch block
public static void testFile() throws IOException{
copyFile("D:\\test1.txt","D:\\test2.txt");
public static void copyFile(String inName,String outName) throws IOException
if(!tmp.canRead())tmp.createNewFile();
BufferedInputStream in= new BufferedInputStream(new FileInputStream(inName));
BufferedOutputStream out= new BufferedOutputStream(new FileOutputStream(outName));
public static void readFile(String inName) throws IOException
BufferedReader read= new BufferedReader(new InputStreamReader(new FileInputStream(inName)));
while((b=read.readLine())!=null)
public static void readFileByte(String inName) throws IOException
BufferedInputStream read= new BufferedInputStream(new FileInputStream(inName));
public static void readFileByFile(String name) throws IOException
FileReader fr= new FileReader(tmp);
BufferedReader br= new BufferedReader(fr);
while((b=br.readLine())!=null)
public static void copyFile(InputStream in,OutputStream out, boolean close) throws IOException{
public static void print(Object o)
public static void fileCheck(String name) throws IOException
print("Canonical name:"+f.getCanonicalPath());
print("Parent directory:"+p);
if(f.canRead())print("file can be read!");
if(f.canWrite())print("file can be writable!");
print("last modified time:"+d);
print("file size is:"+f.length()+" bytes");
}else if(f.isDirectory()){print("is a directry!");}
print("neither a directory or a file!");
三、Java程序性能优化-缓冲(Buffer)(1)
1、本节主要介绍可用于系统性能优化的组件和性能优化思想重点介绍缓冲和缓存这两个组件以及它们的使用方法此外还将介绍几种常用的优化思想如池化对象并行代替串行负载均衡以及时间换空间和空间换时间
2、缓冲区是一块特定的内存区域开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异提高系统的性能在日常生活中缓冲的一个典型应用是漏斗如图所示
3、图显示了漏斗作为缓冲区的使用场景上层系统如茶壶下层系统如水瓶现需要将茶壶中的水倒入水瓶中这就有如将内存中的数据写入硬盘中一样茶壶的出水速度可以很快但是水瓶的瓶口很细因此形成性能瓶颈要将水全部倒入瓶中必须等待瓶口的水缓缓流下为了加快速度可以使用一个漏斗(缓冲)
4、漏斗的初始口径很大并且拥有一定的容量因此茶壶中的水可以先倒入漏斗中就有如内存数据先写入一块缓冲区只要漏斗的容量够大茶壶里的水很快就能倒完至此上层系统完成工作可以去处理其他业务逻辑而此时水并未完全进入瓶中而大部分被积累在漏斗中这就可以由下层系统慢慢处理直到水完全进入瓶中漏斗(缓冲区)被清空
5、注意缓冲可以协调上层组件和下层组件的性能差当上层组件性能优于下层组件时可以有效减少上层组件对下层组件的等待时间
6、基于这样的结构上层应用组件不需要等待下层组件真实地接受全部数据即可返回操作加快了上层组件的处理速度从而提升系统整体性能
7、缓冲最常用的场景就是提高I/O的速度为此 JDK内不少I/O组件都提供了缓冲功能比如当使用FileWriter时进行文件写操作的代码如下
8、 Writer writer= new FileWriter(new File( file txt))
9、 long begin=System currentTimeMillis()
10、 for(int i=; i< CIRCLE; i++){
11、 System out println( testFileWriter spend:+(System currentTimeMillis() begin))
12、为进行I/O优化可以为FileWriter加上缓冲
13、 Writer writer= new BufferedWriter(new FileWriter(new File( file txt)))//增加了缓冲
14、 long begin=System currentTimeMillis()
15、 for(int i=; i< CIRCLE; i++){
16、 System out println( testFileWriterBuffer spend:+(System currentTimeMillis() begin))
17、以上代码使用BufferedWriter为FileWriter对象增加缓冲功能 BufferedWriter对象拥有两个构造函数
18、 public BufferedWriter(Writer out)
19、 public BufferedWriter(Writer out int sz)
20、返回目录 Java程序性能优化让你的Java程序更快更稳定
21、 Visual C++音频/视频技术开发与实战