字符流的继承类图
主要字符流,它们有:
Reader/Writer:字符流的基类,它们是抽象类。
InputStreamReader/OutputStreamWriter:适配器类,输入是InputStream,输出是OutputStream,将字节流转换为字符流。
FileReader/FileWriter:输入源和输出目标是文件的字符流。
CharArrayReader/CharArrayWriter: 输入源和输出目标是char数组的字符流。
StringReader/StringWriter:输入源和输出目标是String的字符流。
BufferedReader/BufferedWriter:装饰类,对输入输出流提供缓冲,以及按行读写功能。
PrintWriter:装饰类,可将基本类型和对象转换为其字符串形式输出的类。
一、Reader/Writer
二、InputStreamReader/OutputStreamWriter 转换流
可以使用指定的编码规范并基于字节流生成对应的字符流
OutputStreamWriter的主要构造方法为:
public OutputStreamWriter(OutputStream out)
public OutputStreamWriter(OutputStream out, String charsetName)
public OutputStreamWriter(OutputStream out, Charset cs)
InputStreamReader的主要构造方法为:
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, String charsetName)
public InputStreamReader(InputStream in, Charset cs)
重要的参数是编码类型,可以通过名字charsetName或Charset对象传入,默认编码 Charset.defaultCharset() 得到 GBK
二、FileReader/FileWriter 字符流
是 InputStreamReader/OutputStreamWriter 的子类。
FileReader 主要构造方法有:
public FileReader(File file) throws FileNotFoundException
public FileReader(String fileName) throws FileNotFoundException
FileWriter 主要构造方法有:
public FileWriter(File file) throws IOException
public FileWriter(File file, boolean append) throws IOException
public FileWriter(String fileName) throws IOException
public FileWriter(String fileName, boolean append) throws IOException
append参数指定是追加(true)还是覆盖 (false),默认覆盖
备注:FileReader/FileWriter不能指定编码类型,只能使用默认编码,如果需要指定编码类型,可以使用InputStreamReader/OutputStreamWriter。
三、CharArrayReader/CharArrayWriter
与字节流 ByteArrayInputStream/ByteArrayOutputStream 是类似的,将字节(byte)数组变为字符(char)数组
四、StringReader/StringWriter
StringReader/StringWriter与CharArrayReader/CharArrayWriter类似,只是输入源为String,输出目标为StringBuffer,而且,String/StringBuffer内部是由char数组组成的,所以它们本质上是一样的。
之所以要将char数组/String与Reader/Writer进行转换也是为了能够方便的参与Reader/Writer构成的协作体系,复用代码。
五、BufferedReader/BufferedWriter
BufferedReader/BufferedWriter是装饰类,提供缓冲,以及按行读写功能。BufferedWriter的构造方法有:
public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)
参数sz是缓冲大小,如果没有提供,默认为8192。它有如下方法,可以输出平台特定的换行符:
public void newLine() throws IOException
BufferedReader的构造方法有:
public BufferedReader(Reader in)
public BufferedReader(Reader in, int sz)
参数sz是缓冲大小,如果没有提供,默认为8192。它有如下方法,可以读入一行:
public String readLine() throws IOException
备注:
字符‘\r‘或‘\n‘或‘\r\n‘被视为换行符,readLine返回一行内容,但不会包含换行符,当读到流结尾时,返回null。
FileReader/FileWriter是没有缓冲的,也不能按行读写,所以,一般应该在它们的外面包上对应的缓冲类。
使用字符缓冲流读取一行文件
1 BufferedReader read = new BufferedReader(new FileReader("D:\\mys\\utf-8.txt"));
2 String str = read.readLine();
3 System.out.println(str);
4 read.close();
输出结果的这一行文字乱码了,这是因为 该文本文件是用 utf-8 的格式保存的,而 eclipse 默认的编码格式是 GBK 。
FileReader/FileWriter不能指定编码类型,只能使用默认编码,InputStreamReader/OutputStreamWriter 可以指定编码类型
故代码做如下更改
1 BufferedReader read = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\mys\\utf-8.txt"), "UTF-8"));
2 String str = read.readLine();
3 System.out.println(str);
4 read.close();
此时,输出结果正常无乱码产生。
字符缓冲流向磁盘写入文件
情况一:由于没有关闭输出流,磁盘文件未成功写入数据。执行 bw.close() 后数据写入
1 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\mys\\sss.txt"));
2 String str = "好朋友呵请问你西游何时回还?可怕的岩山栈道实在难以登攀!";
3 bw.write(str);
情况二:数据正常写入到磁盘
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\mys\\sss.txt"));
String str = "好朋友呵请问你西游何时回还?可怕的岩山栈道实在难以登攀!";
bw.write(str);
bw.flush();
//bw.close();
这是因为,对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出
文本文件和字符流 / 计算机程序的思维逻辑