1. 基本字符输入输出类结构
2. 抽象父类:Writer & Reader
Writer类
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
构造方法:
protected Writer()
创建一个新的字符流的作者,其关键部分将同步在“作者”本身上。
protected Writer(Object lock)
创建一个新的字符流的作者,其关键部分将在给定的对象上同步。
常用方法:
void write(int c)
写一个字符。
void write(String str)
写一个字符串。
void write(String str, int off, int len)
写入字符串的一部分。
Reader类
public abstract class Reader
extends Object
implements Readable, Closeable
构造方法:
protected Reader()
创建一个新的字符流阅读器,其关键部分将同步在阅读器本身上。
protected Reader(Object lock)
创建一个新的字符流阅读器,其关键部分将在给定的对象上同步。
常用方法:
int read()
读一个字符
int read(char[] cbuf)
将字符读入数组。
abstract int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。
2.1 实现类:字符过滤流 PrintWriter & BufferedReader
BufferedReader(字符过滤流)
public class BufferedWriter
extends Writer
public class BufferedReader
extends Reader
- 支持输入换行符。提供了一个newLine()方法,它使用平台自己的系统属性line.separator定义的换行符;
- 可一次写一行、读一行,代码冗余;
- 不建议使用BufferedWriter,使用PrintWriter更好一些。
PrintWriter(写入后换行)【常用】
public class PrintWriter
extends Writer
- 封装了print() / println()方法,支持写入后换行。
- 实际使用中将PrintWriter与BufferedReader一起使用。
代码示例:
public class TestBuffered {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("files\\chars.txt");
//BufferedWriter bw = new BufferedWriter(fw);
//bw.write("Hello");
//bw.newLine(); // 根据平台换行符换行
//bw.write("World");
//bw.close();
// 字符输出过滤流:PrintWriter, 比BufferedWriter更方便,提供了根据平台换行方法
PrintWriter pw = new PrintWriter(fw);
pw.println("Hello");
pw.println("world");
pw.println("今天天气不错");
pw.close();
// 字符输入过滤流:BufferedReader, 每次读取1行,文件末尾返回的是null
FileReader fr = new FileReader("files\\chars.txt");
BufferedReader br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) { // 读取一行字符串
System.out.println(line);
}
br.close();
}
}
2.2 实现类:桥转换流 OutputStreamWriter & InputStreamReader
- 可将字节流转换为字符流;(为的就是可以设置字符编码方式)
- 可指定字符的编码方式;
字节流转换字符流步骤:
①创建字节流 Output/InputStream
②创建过滤流,设置字符编码集(按需) OutputStreamWriter/InputStreamReader
③封装过滤流 PrintWriter/BufferedReader
④读写数据 write/read
⑤关闭流 close
代码示例:
public class TestConvertStream {
public static void main(String[] args) throws IOException {
// 1.字节输出流对象
OutputStream os = new FileOutputStream("files\\convert.txt");
// 2.转换为字符输出流对象:可指定写的数据的【编码】格式
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
// 3.包装为字符过滤流:写入换行PrintWriter
PrintWriter pw = new PrintWriter(osw);
// 一行套娃写法
PrintWriter pw1 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("files\\convert.txt"), "UTF-8"));
//osw.write("你好世界!!!");
//osw.close();
pw.println("你好世界!!!");
pw.close();
pw1.close();
// 1.字节输入流对象
InputStream is = new FileInputStream("files\\convert.txt");
// 2.转换为字符输入流对象:可指定读的数据的【解码】格式
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
// 3.包装为字符过滤流
BufferedReader br = new BufferedReader(isr);
// 一行套娃写法
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream("files\\convert.txt"), "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
br1.close();
System.out.println("OK");
}
}
2.3 实现类:字符节点流 FileWriter & FileReader - (桥转换流的子类)
这一对儿为桥转换流的子类。
FileWriter类
public class FileWriter
extends OutputStreamWriter
public void write(String str) // 一次将字符串直接写入文件
FileReader类
public class FileReader
extends InputStreamReader
public int read(char[] c) // 从流中读取多个字符,将读到的内容存入c数组,返回实际读到的字符数;如果达到文件尾,则返回-1
代码示例:
public class TestWriter {
public static void main(String[] args) throws IOException {
// 写文件
FileWriter fw = new FileWriter("files\\chars.txt");
fw.write("Hello今天天气好65\n");
char[] cs = new char[] {'你', '好', '吗'};
fw.write(cs);
fw.flush();
fw.close();
// 读文件
FileReader fr = new FileReader("files\\chars.txt");
char[] cache = new char[4];
while(true) {
int n = fr.read(cache);
if (n < 0) {
break;
}
for (int i = 0; i < n; i++) {
System.out.print(cache[i]);
}
System.out.println();
}
fr.close();
}
}