缓冲流,提高了读写的性能;当然无论如何,必须使用的就是节点流; 如果说单纯使用节点流,我试了一下,复制一个简单的文件,节点流耗时如果是 150左右,而缓冲流耗时大概只有50到60多,基本上缓冲流是节点流的速度的三倍;
1.字节流缓冲复制( BufferedInputStream和BufferedOutputStream)
这个缓冲流的基本用法和之前的字节流差不多,可以理解为不过是在字节流中加了层壳,同样的也增加了数据读取的速度;可以这样理解,就是字节流他就是按规定的字节传输,有时可能很小就开始传输了,但是缓冲流则是必须要那么多字节才会传输一次,比如:搬家,每次搬一点东西,每次都要来回走(这就像是读取硬盘信息),但是一次性多搬一点(节省了来回走动,也就是多次读取的时间),东西愈多,自然愈慢;
public class TestBufferIn {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
BufferedOutputStream bufferedOutputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
in = new FileInputStream("E:\\IDEA数据\\NOweb\\FIDEA\\FileText\\src\\TextDecurate.java");
out = new FileOutputStream("copy.txt");
bufferedInputStream = new BufferedInputStream(in);
bufferedOutputStream = new BufferedOutputStream(out);
int lenth = -1;
byte[] arr = new byte[1024];
while ((lenth = bufferedInputStream.read(arr)) != -1) {
bufferedOutputStream.write(arr);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedOutputStream.close();
bufferedInputStream.close();
/* public void close() throws IOException {
byte[] buffer;
while ( (buffer = buf) != null) {
if (bufUpdater.compareAndSet(this, buffer, null)) {
InputStream input = in;//这里很明显是找到了输入流的节点流,
in = null;
if (input != null)
input.close();//在节点流中数据不为空的情况下,这里也对节点流进行关闭;
return;//所以归根结底,处理流的关闭,就是关闭他所对应的节点流;
}*/
//这后面两个其实不需要再次关闭,我们可以看看处理流close源码;如上:
// in.close();
// out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.字符缓冲流复制(BufferReader和BufferWriter)
这个字符缓冲流,和之前的字符流复制也差不多,可以理解为在之前的字符流外面添加了一个缓冲流的壳;
public class TestBufferWR {
public void CopyFile(FileWriter write, FileReader reader) {
//定义一个liner用来查看是否复制完毕
String liner = null;
//将两个字符流放入到缓冲流中去,这里使用的是try-with-resource
try (BufferedReader breader = new BufferedReader(reader);
BufferedWriter bwriter = new BufferedWriter(write)) {
//开始复制文件;
while ((liner = breader.readLine()) != null) {
bwriter.write(liner);
bwriter.newLine();
}
bwriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestBufferWR tb = new TestBufferWR();
try {
//定义文件存放路径,只能是字符文件;
FileReader reader = new FileReader("./FileText/src/TextFile.java");
FileWriter writer = new FileWriter("CopyText.txt");
tb.CopyFile(writer, reader);
} catch (IOException e) {
e.printStackTrace();
}
}
}