一、什么是字符流?
字符流是由字符组成的,例如 FileReader、FileWriter、BufferedReader、BufferedWriter、InputStreamReader、OutputStreamWriter 等。
在I/O流中,传输的数据类型是字节(Byte)的就是字节流,传输的数据类型是字符(Char)的就是字符流。
二、字符流分类
Reader类字符读取流、BufferedReader
Reader是一个抽象类,它是以字符为单位的输入流的公共父类。
Writer类字符写入流、BufferedWriter
Writer类是Java IO中所有Writer的基类,子类包括BufferedWriter和PrintWriter等等。
三、FileReaer、FileWriter方法
FileReader类从InputStreamReader类继承而来,该类按字符读取流中数据。
方法 | 说明 |
FileReader(File file) | 构造方法,在给定从中读取数据的 File 的情况下创建一个新 FileReader |
FileReader(FileDescriptor fd) | 构造方法,在给定从中读取数据的 FileDescriptor 的情况下创建 一个新 FileReader |
FileReader(String fileName) | 构造方法,在给定从中读取数据的文件名的情况下创建一个新 FileReader |
int read() | 读取单个字符,返回一个int型变量代表读取到的字符,返回-1代 表读到文件结尾 |
int read(char [] c, int offset, int len) | 读取字符到c数组,返回读取到字符的个数 |
读取一个文本文件的内容实例:
try(FileReader fr = new FileReader("m.txt")) {
System.out.println(fr.read());
char c = (char)fr.read();
System.out.println(c);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
FileWriter 类从 OutputStreamWriter 类继承而来,该类按字符向流中写入数据。
方法 | 说明 |
FileWriter(File file) | 构造方法,在给出 File 对象的情况下构造一个 FileWriter 对象 |
FileWriter(File file, boolean append) | 构造方法,给出 File 对象的情况下构造一个 FileWriter 对象 |
FileWriter(FileDescriptor fd) | 构造方法,造与某个文件描述符相关联的 FileWriter 对象 |
FileWriter(String fileName, boolean append) | 构造方法,给出 File 对象的情况下构造一个 FileWriter 对象 |
void write(int c) | 写入单个字符c |
void write(char [] c, int offset, int len) | 写入字符数组中开始为offset长度为len的某一部分 |
void write(String s, int offset, int len) | 写入字符串中开始为offset长度为len的某一部分 |
将三行字符串,直接写追加到一个文件中实例:
try(FileWriter fw = new FileWriter("m2.txt",true)){
fw.write("hello中\n");
fw.write("hello文\n");
fw.write("java\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
四、BufferedReader、BufferedWriter
BufferedWriter 起始跟 FileWriter 的使用没什么区别,属于字符输出流。
BufferedWriter 更高效,因为它内置有一个长度为 8192 的字符数组,也就是 8K 的字符数组。这样子,如果我们往文件里面写内容的话,如果内容没有填满这个数组,就会自动等待直到我们填满,然后一起写入硬盘。硬盘的运行速度是很慢的。但是我们也可以利用 close() 方法,虽然它可能没有满,但是还是可以强制让它写入硬盘。
除此之外,BufferedWriter 还提供了自动换行的方法 —— newLine() 方法,它会根据操作系统的不一样,自动增添换行符。在实际开发中,如果要换行,就尽量使用 newLine() 方法。
BufferedReader实例:
try(FileReader fr = new FileReader("m.txt");BufferedReader br = new
BufferedReader(fr)){
while(br.ready()){
System.out.println(br.readLine());
}
} catch (IOException e) {
throw new RuntimeException(e);
}
BufferedReader 起始跟 FileReader 的使用没什么区别,属于字符输入流。
BufferedReader 更高效,因为它内置有一个长度为 8192 的字符数组,也就是 8K 的字符数组。这样子,如果我们从文件里面读内容的话,如果内容没有填满这个数组,就会自动等待直到我们填满,然后一起从硬盘读到内存。硬盘的运行速度是很慢的。但是我们也可以利用 close() 方法,虽然它可能没有满,但是还是可以强制让它读入内存。
除此之外,BufferedReader 还提供了读取一整行的方法 —— readLine() 方法。
字符串写入文件实例:
try (FileWriter fw = new FileWriter("m.txt"); BufferedWriter bw = new
BufferedWriter(fw)) {
bw.write("ok");
bw.newLine();
bw.write("java中文字符串");
bw.write("\n123");
} catch (IOException e) {
throw new RuntimeException(e);
}