简介
在IO流里面有4个缓存流,分别是:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低。就算用到read(byte [ ])每次读取多个字节,当文件过大时,操作起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。写文件也类似。
有无缓冲区效率的比较,以字节流为列。
package Buffer;
import java.io.*;
/**
* 字节缓冲流
*/
public class Buffer_byte {
public static void main(String[] args) throws IOException {
File file=new File("Buffer");
//缓冲流
BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
int temp=0;
long time=System.currentTimeMillis();//获取当前时间至1970-1-1的毫秒数
while ((temp=bfis.read())!=-1){
// System.out.print((char) temp);
}
time=System.currentTimeMillis()-time;
bfis.close();
System.out.println("缓冲流读:"+time+"ms");
//非缓冲
FileInputStream fis=new FileInputStream(file);
temp=0;
time=System.currentTimeMillis();
while ((temp=fis.read())!=-1){
// System.out.print((char) temp);
}
time=System.currentTimeMillis()-time;
fis.close();
System.out.println("非缓冲区读:"+time+"ms");
}
}
结果:
以上代码我们只读不输出,显然使用缓冲区的效率要高。
字节缓冲流和字符缓冲流
字节缓冲流:BufferedInputStream,BufferedOutputStream。字符缓冲流:BufferedReader,BufferedWriter。在使用不同的缓冲流,我们传入的参数也是不同的。在字节缓冲流中,我们需要传入基于字节的输入输出流。字符流中也是一样。如果我们需要在字符流中对字节流进行操作呢?IO里面刚好有两个转换流:InputStreamReader和OutputStreamWriter,将字节流转换为字符流,以便我们在字符缓冲里面操作字节流。
字节缓冲流BufferedInputStream和BufferedOutputStream实现文件拷贝
package Buffer;
import java.io.*;
public class Buffer_Stream_Copy {
public static void main(String[] args) throws IOException {
File file=new File("buffer.txt");
if(!file.isFile()){ return; }
BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bfos=new BufferedOutputStream(new FileOutputStream("src\\"+file.getName()));//copy到src目录下
byte bytes[]=new byte[1024];
int temp=0; //边读边写
while ((temp=bfis.read(bytes))!=-1){//读
bfos.write(bytes,0,temp); //写
}
bfos.flush();
bfos.close();
bfis.close();
System.out.println("copy成功!");
}
}
字符缓冲流BufferedReader和BufferedWriter实现文件拷贝
package Buffer;
import java.io.*;
public class Buffer_Char_Copy {
public static void main(String[] args) throws IOException{
File file=new File("buffer.txt");
//转换流
// BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
BufferedReader br=new BufferedReader(new FileReader(file));
// BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src\\"+file.getName())));
BufferedWriter bw=new BufferedWriter(new FileWriter("src\\"+file.getName()));
String temp=null;
while ((temp=br.readLine())!=null){//每次读取一行数据 如果没有则返回空
bw.write(temp);
bw.newLine();//换行 读一行换一行
}
bw.flush();
br.close();
bw.close();
System.out.println("Copy完成!");
}
}
当我们使用字符缓冲流时,每次从缓冲区读取一行放入temp中,然后写入,在写入过程中并不包含"\n"换行,所以需要我们调用缓冲流中的newLine()进行换行,否则字符都会连在一起。
每日鸡汤:记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的!
Over!