Java基本字符流输入输出类的使用

1. 基本字符输入输出类结构 Java基本字符流输入输出类的使用
文章图片
Java基本字符流类结构 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 Writerpublic 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 = newFileOutputStream("files\\convert.txt"); // 2.转换为字符输出流对象:可指定写的数据的【编码】格式 OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8"); // 3.包装为字符过滤流:写入换行PrintWriter PrintWriter pw = new PrintWriter(osw); // 一行套娃写法 PrintWriter pw1 = new PrintWriter(newOutputStreamWriter(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(newInputStreamReader(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 - (桥转换流的子类) 【Java基本字符流输入输出类的使用】这一对儿为桥转换流的子类。
FileWriter类
public class FileWriter extends OutputStreamWriterpublic void write(String str) // 一次将字符串直接写入文件

FileReader类
public class FileReader extends InputStreamReaderpublic 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(); } }

    推荐阅读