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

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

Java基本字符流输入输出类的使用_第1张图片
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 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();
      }
}

你可能感兴趣的:(Java基本字符流输入输出类的使用)