【JAVA入门】Day41 - 字节缓冲流和字符缓冲流
【JAVA入门】Day41 - 字节缓冲流和字符缓冲流
文章目录
- 【JAVA入门】Day41 - 字节缓冲流和字符缓冲流
- 一、缓冲流的体系结构
- 二、字节缓冲流
- 2.1 字节缓冲流提高效率的底层原理
- 三、字符缓冲流
在IO流体系中,FileInputStream,FileOutputStream,FileReader,FileWriter 其实都只是基本流,Java 中还有一些针对他们做出优化的高级流。
一、缓冲流的体系结构
针对字节和字符,Java 分别发明了它们各自的缓冲流。缓冲流一共有四种,Buffered 代表缓冲区,它可以使得读写数据时非常高效。
二、字节缓冲流
字节缓冲流底层自带了一次可以读写 8192 长度的缓冲区。它的构造方法是将基本流通过一个方法进行包装,加入缓冲区。
以下演示了如何利用字节缓冲流来拷贝一个文件:
package BufferedStream;
import java.io.*;
public class BufferedStreamDemo1 {
public static void main(String[] args) throws IOException {
/*
字节缓冲流拷贝文件(一次读写一个字节)
*/
//1.创建缓冲流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a_Copied.txt"));
//2.循环读取并写入目的地
int b;
while((b = bis.read()) != -1){
bos.write(b);
}
//3.释放资源
bos.close();
bis.close();
}
}
package BufferedStream;
import java.io.*;
public class BufferedStreamDemo2 {
public static void main(String[] args) throws IOException {
/*
字节缓冲流拷贝文件(一次读写一个字节数组)
*/
//1.创建缓冲流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a_Copied.txt"));
//2.字节数组
byte[] bytes = new byte[1024 * 1024 * 5];
int len;
while((len = bis.read(bytes)) != -1){
bos.write(bytes,0,len);
}
//3.关闭流
bos.close();
bis.close();
}
}
2.1 字节缓冲流提高效率的底层原理
字节缓冲流读写数据的内存结构如下图所示:
可以看到,读写数据时,字节数据是在内存中的缓冲区进行倒手的,而内存的读写数据是非常非常快的,它的读写速度快到这个倒手的过程可以忽略不计,大大节省了数据与硬盘之间的交互时间。
三、字符缓冲流
字符流本身就具有缓冲区,速度已经很快,而字符缓冲流进一步加快了读写速度。
其构造方法如下:
特别的是,字符缓冲流中还有两个非常有用的特有方法:
readLine() 方法让我们可以一行一行读取数据,newLine() 方法是一个跨平台的换行方法,使用它可以保证在 Windows、Linux、Mac 所有操作系统下的换行都能生效且不会出错。
① 字符缓冲输入流的用法:
package BufferedStream;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedStreamDemo3 {
public static void main(String[] args) throws IOException {
/*
字符缓冲输入流
*/
//1.创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\a.txt"));
//2.一行一行读
String line;
while((line = br.readLine()) != null) {
System.out.println(line);
}
//3.释放资源
br.close();
}
}
② 字符缓冲输出流的用法:
package BufferedStream;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedStreamDemo5 {
public static void main(String[] args) throws IOException {
/*
字符缓冲输出流
*/
//1.创建
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IdeaProjects\\HelloWord\\src\\BufferedStream\\b.txt"));
//2.写出数据
bw.write("你嘴角上扬的样子,百度搜索不到");
bw.newLine(); //跨平台换行
bw.write("以后如果我结婚了,你一定要来哦,没有新娘我会很尴尬");
bw.newLine();
//3.释放资源
bw.close();
}
}