缓冲流
字节缓冲流
字节缓冲流就是底层自带了缓冲区的字节流,提高了读取/写入的性能
构造方法
BufferedInputStream 字节缓冲输入流
public BufferedInputStream(InputStream is)
把基本流包装成高级流,提高读取数据的性能,缓冲区大小默认为 8129public BufferedInputStream(InputStream is,int size)
把基本流包装成高级流,提高读取数据的性能,并指定缓冲区大小
BufferedOutputStream 字节缓冲输出流
public BufferedOutputStream(OutputStream os)
把基本流包装成高级流,提高写入数据的性能,缓冲区大小默认为 8129public BufferedOutputStream(OutputStream os,int size)
把基本流包装成高级流,提高写入数据的性能,并指定缓冲区大小
代码示例
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
// 创建对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("aaa.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bbb.txt"));
// 复制数据
int chr;
while((chr = bis.read()) != -1) {
bos.write(chr);
}
/*
* byte[] bytes = new byte[1024];
* int len;
* while((len = bis.read(bytes)) != -1){
* bos.write(bytes,0,len);
* }
*/
// 释放资源
bos.close();
bis.close();
}
}
原理
以下是原理图:
- 如果用的是空参 read 方法
- 变量 ch 作为两个缓冲区之间的临时存储空间,一个字节一个字节的将数据从输入流的缓冲区传到输出流的缓冲区
- 如果用的是有参 read 方法
- 字节数组 bytes 作为两个缓冲区之间的临时存储空间,将数组长度的字节数据从输入流的缓冲区传到输出流的缓冲区
字符缓冲流
字符缓冲流就是底层自带了缓冲区的字符流,提高了读取/写入的性能
构造方法
BufferedReader 字符缓冲输入流
BufferedReader(Reader r)
BufferedReader(Reader r,int size)
BufferedWriter 字符缓冲输出流
BufferedWriter(Writer w)
BufferedWriter(Writer w,int size)
readLine()
字符缓冲输入流的特有方法:
public String readLine()
读取一行数据,如果没有数据可读,返回 null
代码示例:
读取一行数据:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Demo { public static void main(String[] args) throws IOException { // 创建对象 BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); // 读取数据 String line = br.readLine(); System.out.println(line); // 释放资源 br.close(); } }
注意事项:readLine 方法一次读取一整行数据,遇到回车换行结束,但是不会把回车换行读取到内存当中
循环读取
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Demo { public static void main(String[] args) throws IOException { // 创建对象 BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); // 读取数据 String line; while((line = br.readLine()) != null) { System.out.println(line); } // 释放资源 br.close(); } }
newLine()
字符缓冲输出流的特有方法:
public void newLine()
跨平台的换行
代码示例:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
// 创建对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
// 写入数据
bw.write("月色真美");
bw.newLine();
bw.write("跟你一样");
// 释放资源
bw.close();
}
}
注意事项:如果要开追加模式(续写),true 应该加在 FileWriter 里面,因为 BufferedWriter 没有这个模式
缓冲区
虽然字节缓冲流和字符缓冲流的缓冲区长度都为 8192,但是字节缓冲流的是 8192 个字节,是 byte 类型的,占内存 8K,而字符缓冲流的是 8192 个字符,是 char 类型的,占内存 16K