03-字符流读写

基本字符流

1. 基本字符输入输出类结构

Java基本字符流类结构

2. 抽象父类:Writer & Reader

Writer类

1
2
3
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable

构造方法:

1
2
3
4
protected Writer()
创建一个新的字符流的作者,其关键部分将同步在“作者”本身上。
protected Writer(Object lock)
创建一个新的字符流的作者,其关键部分将在给定的对象上同步。

常用方法:

1
2
3
4
5
6
void write(int c)
写一个字符。
void write(String str)
写一个字符串。
void write(String str, int off, int len)
写入字符串的一部分。

Reader类

1
2
3
public abstract class Reader
extends Object
implements Readable, Closeable

构造方法:

1
2
3
4
protected Reader()
创建一个新的字符流阅读器,其关键部分将同步在阅读器本身上。
protected Reader(Object lock)
创建一个新的字符流阅读器,其关键部分将在给定的对象上同步。

常用方法:

1
2
3
4
5
6
int read()
读一个字符
int read(char[] cbuf)
将字符读入数组。
abstract int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。

2.1 实现类:字符过滤流 PrintWriter & BufferedReader

BufferedReader(字符过滤流)

1
2
3
4
5
public class BufferedWriter
extends Writer

public class BufferedReader
extends Reader
  • 支持输入换行符。提供了一个newLine()方法,它使用平台自己的系统属性line.separator定义的换行符;
  • 可一次写一行、读一行,代码冗余;
  • 不建议使用BufferedWriter,使用PrintWriter更好一些。

PrintWriter(写入后换行)【常用】

1
2
public class PrintWriter
extends Writer
  • 封装了print() / println()方法,支持写入后换行。
  • 实际使用中将PrintWriter与BufferedReader一起使用。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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类

1
2
3
4
public class FileWriter
extends OutputStreamWriter

public void write(String str) // 一次将字符串直接写入文件

FileReader类

1
2
3
4
public class FileReader
extends InputStreamReader

public int read(char[] c) // 从流中读取多个字符,将读到的内容存入c数组,返回实际读到的字符数;如果达到文件尾,则返回-1

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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();
}
}

03-字符流读写
https://janycode.github.io/2016/04/28/02_编程语言/01_Java/01_JavaSE/06_文件和流/03-字符流读写/
作者
Jerry(姜源)
发布于
2016年4月28日
许可协议