缓冲流
缓冲流(Buffered Streams)是一种用于提高输入/输出操作效率的流,它通过使用内部缓冲区减少对底层设备的读写操作。
缓冲流会先将数据一次性读取到内存中,然后再一次性写入文件,这样能显著提升性能,尤其是处理大数据量时。
字节缓冲流
BufferedInputStream
BufferedInputStream
用于对输入流的缓冲处理。它会将读取的字节先存在缓冲区中,再通过缓冲区一次性读取数据,避免了每次读取操作都访问底层设备。
构造函数:
构造函数 | 描述 |
---|---|
BufferedInputStream(InputStream i) | 传递InputStream流作为参数,对输入流做缓冲 |
BufferedInputStream(InputStream i, int size) | 传递InputStream流作为参数,并指定缓冲区大小(默认8192字节) |
常用方法和 FileInputStream
一样。
java
BufferedInputStream bis
= new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4")); // 默认8192字节,即8kb
BufferedInputStream bis
= new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4"), 16384); // 设置16384字节,即16kb
BufferedOutputStream
BufferedOutputStream
用于对输出流的缓冲处理。它会将写入的数据先保存再缓冲区中,等缓冲区满了之后再一起写入到目标文件。
构造函数:
构造函数 | 描述 |
---|---|
BufferedOutputStream(OutputStream o) | 传递OutputStream流作为参数,对输出流做缓冲 |
BufferedOutputStream(OutputStream o, int size) | 传递OutputStream流作为参数,并指定缓冲区大小(默认8192字节) |
常用方法和 FileOutputStream
一样。
java
BufferedOutputStream bos
= new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4")); // 默认8192字节,即8kb
BufferedOutputStream bos
= new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4"), 16384); // 设置16384字节,即16kb
提示
- 在使用缓冲流时,我们只需要关闭缓冲流即可,其内部会自动关闭传入的字节流;
- 为什么缓冲流底层默认使用了8192个字节作为缓冲区大小呢?因为8192字节是经过测试后的折中数值,这样可以不浪费内存;
文件复制
可以对比使用普通字节流和缓冲流的耗时,很明显,缓冲流的速度要快于字节流。
java
@Test
public void test1() throws IOException {
long start = System.currentTimeMillis();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4"));
byte[] bytes = new byte[1024];
int len;
// 每次读取1024个字节
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len); // 将读取的数据写入文件
}
bis.close();
bos.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
java
@Test
public void test() throws IOException {
long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("E:\\StudyCode\\1.mp4");
FileOutputStream fos = new FileOutputStream("E:\\StudyCode\\2.mp4");
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
fis.close();
fos.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
字符缓冲流
IO流中字符流底层是有缓冲区的,所以在效率上字符缓冲流体现的不明显,但是字符缓冲流有特有的方法,需要了解。
BufferedWriter
BufferedWriter
对字符输出流进行缓冲,常用于按行写入文本数据。
构造函数:
构造函数 | 描述 |
---|---|
BufferedWriter(Writer out) | 创建默认大小输出缓冲流 |
BufferedWriter(Writer out, int sz) | 创建指定大小输出缓冲流 |
常用方法和 FileWriter
一样,但它有特有方法:
方法 | 描述 |
---|---|
newLine() | 写入行分隔符 |
java
@Test
public void test() throws IOException {
BufferedWriter bw
= new BufferedWriter(new FileWriter("1.txt", true));
bw.write("床前明月光");
bw.newLine();
bw.write("疑是地上霜");
bw.newLine();
bw.write("举头望明月");
bw.newLine();
bw.write("低头思故乡");
bw.newLine();
bw.close();
}
BufferedReader
BufferedReader
对字符输入流进行缓冲,常用于按行读取文本数据。
构造函数:
构造函数 | 描述 |
---|---|
BufferedReader(Reader in) | 创建默认大小的缓冲区输入流 |
BufferedReader(Reader in, int sz) | 创建指定大小的缓冲区输入流 |
常用方法和 FileReader
一样,但它有特有方法:
方法 | 描述 |
---|---|
readLine() | 每次读取一行文本,读到文件接收,返回null |
java
@Test
public void test() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("1.txt"));
// 每次读取一行,读到文件结束,返回null
String s = br.readLine();
System.out.println(s);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}