今天回顾总结了一下,Java IO里面的InputStream、InputStreamReader、BufferedReader用法区别
- 字节流
InputStream
是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等
OutputStream
是字节输出流的所有类的超类,一般我们使用它的子类,如FileOutputStream等 - 字符流
Reader
是字符输入流的所有类的超类,Writer
是字符输出流的所有类的超类
InputStreamReader
、OutputStreamWriter
是子类,是字节流通向字符流的桥梁,它将字节流转换为字符流
还有一个类FileReader
继承自InputStreamReader
,可以通过传入一个文件名
快速构建字符流 - 缓冲流
BufferedReader
由Reader类扩展而来,提供通用的缓冲方式文本读取,readLine读取一个文本行,
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedWriter
由Writer 类扩展而来,提供通用的缓冲方式文本写入, newLine使用平台自己的行分隔符,
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
自己写的实例操作代码
- 字节流读取
@Test
public void inputStreamTest() throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\idea-Java\\feifei\\test.txt");
// 字节流读取
byte[] bytes = new byte[1024];
int len;
// 读取文件内容到bytes数组中,一次读取可以容纳1024个字节
while ((len = fileInputStream.read(bytes)) != -1) {
// 从0开始截取字节数组的len长度的字节
System.out.println(new String(bytes, 0, len, "UTF-8"));
}
fileInputStream.close();
}
- 字符流读取
@Test
public void inputStreamReadTest() throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\idea-Java\\Alibaba\\test.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
int len;
// 字符流读取文件内容,默认一个字符一个字符的读
while ((len = inputStreamReader.read()) != -1) {
// 从0开始截取字节数组的len长度的字节
System.out.println((char) len);
}
fileInputStream.close();
inputStreamReader.close();
}
也可以多个多个字符读取,跟字节流类似,定义一个char数组
- 自带缓冲区的字符流,按行读取
@Test
public void bufferedReadTest() throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\idea-Java\\Alibaba\\test.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String len;
// 字符缓冲流流读取文件内容,通常使用的是一行一行的读
while ((len = bufferedReader.readLine()) != null) {
// 从0开始截取字节数组的len长度的字节
System.out.println(len);
}
fileInputStream.close();
inputStreamReader.close();
bufferedReader.close();
}