Reader
Reader和InputStream是同一个性质,InputStream是一个字节流,以byte为单位,而Reader是字符流,以char为单位。读取字符的方法也是int read(char[] c);
需要注意的是Reader由于是字符流,因此可读性较高,需要更高的编码模式,在创建时需注明。
FileReader:
FileReader是Reader的一个子类,它可以打开文件获取Reader。
public static void main(String[] args) throws IOException {
try(Reader reader = new FileReader("1.txt",StandardCharsets.UTF_8)){
int n;
while((n = reader.read())!=-1) {
System.out.print((char)n);
}
}
}
与InputStream类似,Reader也需要即使释放资源。因此使用try,用read()方法读取字节,传给int n,强转为char类型。
public static void main(String[] args) throws IOException {
try(Reader reader = new FileReader("1.txt",StandardCharsets.UTF_8)){
char[] c = new char[1000];
while(reader.read(c)!=-1) {
System.out.println(c);
}
}
}
与InputStream类似,Reader也需要即使释放资源。用缓冲区,创建char[]数组,缓冲区最大不超过char[]数组的长度,每次填充缓冲区。
CharArrayReader:
内存中模拟一个Reader,实际将char[]数组变成一个Reader:
try (Reader reader = new CharArrayReader("Hello".toCharArray())) {
}
StringReader:与CharArrayReader一样:
try (Reader reader = new StringReader("Hello")) {
}
InputStreamReader:
实际上InputSteamReader是一个InputStream转换为Reade之间的转换器,Reader实际上是基于InputStream构造的,只是在内部将字节转化为字符型。
// 持有InputStream:
InputStream input = new FileInputStream("src/readme.txt");
// 变换为Reader:
Reader reader = new InputStreamReader(input, "UTF-8");
或
try (Reader reader = new InputStreamReader(new FileInputStream("src/readme.txt"), "UTF-8")) {
// TODO:
}
Writer
与Reader相似,Writer也是字符流,以char为单位,可供写入的方法有:
- 写入一个字符(0~65535):void write(int c);
- 写入字符数组的所有字符:void write(char[] c);
- 写入String表示的所有字符:void write(String s)。
FileWriter:
private static void writeFile(String filePath,String str)throws IOException {
// TODO Auto-generated method stub
try(Writer writer = new FileWriter(filePath,StandardCharsets.UTF_8)){
writer.write(str);
}
}
CharArrayWriter和StringWriter:
与CharArrayReader相同
try (CharArrayWriter writer = new CharArrayWriter()) {
writer.write(65);
writer.write(66);
writer.write(67);
char[] data = writer.toCharArray(); // { 'A', 'B', 'C' }
}
OutputStreamWriter:
与OutputStreamReader相同。