Reader字符输入流
Reader是Java的IO库中提供的另一个输入流接口,但是它和InputStream的区别是,InputStream是字节输入流,即以byte字节为读取单位,而Reader是字符输入流,即以char字符为读取单位的。
Reader是所有字符输入流的超类。
FileReader
FileReader是Reader的一个子类,它可以打开文件并获取Reader,下述代码演示了如何完整的读取一个FileReader的所有字符:
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo16_FileReader {
public static void main(String[] args) {
//创建一个FileReader对象
try ( Reader reader = new FileReader("D:\\IO流\\reader.txt")) {
//反复调用read()方法,直到返回-1
for(;;) {
int n=reader.read();
if (n==-1) {
break;
}
System.out.println((char)n);
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果:
i
a
m
r
e
a
d
e
r
此时我们读取的是一个纯ASCALL编码的文本文件,那么它可以正常的读取出文件中的内容,但是如果文件中包含中文,就会出现乱码,要避免乱码问题,我们需要指定编码集:
Reader reader = new FileReader(
"D:\\IO流\\reader.txt",StandardCharsets.UTF_8);
BufferedReader
BufferedReader和BufferedInputStream原理相似,只不过一个的读取对象是字符,一个是字节。
try (BufferedReader reader = new BufferedReader(
new FileReader("D:\\IO流\\README.md"))) {
String line=null;
while((line=reader.readLine())!=null) {
System.out.println(line);
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStreamReader
InputStream是字节输入流,Reader是字符输入流,那么InputStreamReader是什么呢?它和前两者有什么关系呢?
我们使用InputStream可以把一个InputStream转换成一个Reader。Reader实际上是基于InputStream构造的,因为Reader需要从InputStream中读取字节流,然后根据编码设置,再转换成char就可以实现字符流。
既然Reader本质是基于InputStream的,那么如果我们有一个InputStream,想把它转换成Reader是完全可行的,InputStreamReader就是这样一个转换器,它可以将任何InputStream转换为Reader。
try(InputStream input=new FileInputStream("D:\\IO流\\Reader.txt");
//转换为Reader
Reader reader=new InputStreamReader(input,"UTF_8");){
//TODO
}catch (Exception e){
//TODO
}
Writer字符输出流
Writer就是带编码转换器的OutputStream,它把byte转换成char输出,Writer是所有字符输入流的超类。
OutputStream | Writer |
以byte为单位 | 以char为单位 |
写入字节(0-255):void write(int b) | 写入字符(0-65535):void write(int b) |
写入字节数组:void write(byte[] b) | 写入字符数组:void write(char[] b) |
写入String:无对应方法 | 写入String:void write(String s) |
FileWriter
它的使用方法和FileReader类似
try (Writer writer = new FileWriter("D:\\IO流\\Writer.txt")) {
writer.write('H');//写入单个字符
writer.write("Hello".toCharArray());//写入char[]
writer.write("Hello");//写入String
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStreamWriter
OutputStreamWriter就是一个将任意OutputStream转换成Writer的转换器:
try(Writer writer=new OutputStreamWriter(new OutputStream("D:\\d.txt"))