带缓冲的字符流、转换流
本文简要介绍带缓冲的字符流BufferedReader、BufferedWrite和转换流InputStreamReader、OutputStreamWriter。
1.BufferedReader
带缓冲的字符输入流。继承Reader。
其构造方法中的参数是一个Reader,但是Reader是一个抽象类,所以要借助Reader的子类。
关闭流只需要关闭带缓冲的字符流,带缓冲的字符流的close()内部会自动调用其参数的流的close()。
带缓冲的字符流不需要再借助数组读取数据了,其自带缓冲。
它有一个特殊的方法readLine(),每次可以读取一行数据,返回值为String,当读到文件末尾时返回null。
使用:
package com.dh.io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReader01 {
public static void main(String[] args) {
//构造方法的参数需要一个Reader
//但是Reader是一个抽象类,所以我们可以使用其子类FileReader
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader("IO\\Hello.java");
br = new BufferedReader(fr);
//带缓冲的字符流不再需要借助数组了,自带缓冲
//具有一个特殊的方法,每次读取一行,当没有读取数据时,返回null
String s1 = null;
while((s1 = br.readLine()) != null){
System.out.println(s1); //读取一行,不包括换行符
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//只需要关闭最外层的br
//br调用close()时,br的close()内部会调用fr的close()
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.包装流和节点流
当一个流的构造方法需要借助另外一个流实例化对象时,参数中的那个流称为节点流,构造对象的那个流称为包装流,也叫做处理流。
如:
FileReader fr = new FileReader("IO\\Hello.java");
BufferedReader br = new BufferedReader(fr);
fr:字节流;
br:包装流/处理流。
(包装流和节点流是相对的关系)
3.InputStreamReader
如果现在有一个字节流,但是参数需要的是一个字符流,我们就可以通过转换流,将字节流转换为字符流了。
InputStreamReader就可以将一个字节输入流转换为一个字符输入流。
package com.dh.io;
import java.io.*;
public class BufferedReader02 {
public static void main(String[] args) {
BufferedReader br = null;
try {
//字节输入流
FileInputStream fis = new FileInputStream("IO\\Hello.java");
//将字节输入流转换为字符输入流
InputStreamReader reader = new InputStreamReader(fis);
br = new BufferedReader(reader);
//上述代码可写作一行
//br = new BufferedReader(new InputStreamReader(new FileInputStream("IO\\Hello.java")));
String s1 = null;
while((s1 = br.readLine()) != null){
System.out.println(s1); //读取一行,不包括换行符
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//只需要关闭最外层的br
//br调用close()时,br的close()内部会调用fr的close()
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.BufferedWriter
带缓冲的字符输出流。
package com.dh.io;
import java.io.*;
public class BufferedWriter01 {
public static void main(String[] args) {
BufferedWriter bw = null;
try {
FileOutputStream fos = new FileOutputStream("IO\\test.txt",true);
OutputStreamWriter writer = new OutputStreamWriter(fos);
bw = new BufferedWriter(writer);
bw.write("hello world");
bw.write("\n");
bw.write("hello kitty");
bw.write("\n");
bw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.OutputStreamWriter
把字节输出流转换为字符输出流。
FileOutputStream fos = new FileOutputStream("IO\\test.txt",true);
OutputStreamWriter writer = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(writer);