字符流

Reader

Reader是 IO 库中提供的另一个输入流接口,和InputStream的区别是,InputStream是一个字节流,以byte为单位读取,而Reader是一个字符流,以char为单位读取。

InputStream
Reader

字节流,以byte为单位

字符流,以char为单位

读取字节(-1,0~255):int read()

读取字符(-1,0~65535):int read()

读到字节数组:int read(byte[] b)

读到字符数组:int read(char[] c)

int read()这个方法读取字符流的下一个字符,并返回字符表示的int,范围是0~65535。如果已读到末尾,返回-1

try (FileReader fileReader = new FileReader("test.txt", StandardCharsets.UTF_8)) {
    int temp;
    while ((temp = fileReader.read()) != -1) {
        System.out.println((char) temp);
    }
} catch (IOException e) {
    System.out.println("文件读取出错");
}

FileReader

try (FileReader fileReader = new FileReader("input.txt", StandardCharsets.UTF_8);) {
    char[] buffer = new char[5];
    int character;
    while ((character = fileReader.read(buffer)) != -1) {
        String content = new String(buffer, 0, character);
        System.out.print(content);
    }
}  catch (IOException e) {
    e.printStackTrace();
}

假设在input.txt中的文本是hello world,那么在第一次首先读取5个字符(即hello),此时buffer中存储的就是hello,第二次读取 worl,第三次读取后,buffer中存储的是dworl

此时如果想要查看读取的内容时候,应该从character的长度中读取,也就是读取多少,取出多少,如果按照buffer的长度来打印内容时候,就会导致多处来字符。

Drawing

Writer

Writer是带编码转换器的OutputStream,他把char转换为byte并输出。WriterOutputStream的区别如下。

OutputStream
Writer

字节流,以byte为单位

字符流,以char为单位

写入字节(0~255):void write(int b)

写入字符(0~65535):void write(int c)

写入字节数组:void write(byte[] b)

写入字符数组:void write(char[] c)

无对应方法

写入String:void write(String s)

Writer是所有字符输出流的超类,它提供的方法主要有:

  • 写入一个字符(0~65535):void write(int c)

  • 写入字符数组的所有字符:void write(char[] c)

  • 写入String表示的所有字符:void write(String s)

FilteWriter

FileWriter就是向文件中写入字符流的Writer。例如:

try (FileWriter fileWriter = new FileWriter("test.txt")) {
    fileWriter.write("h");
    fileWriter.write("hello world".toCharArray());
    fileWriter.write("hello world");
}

CharArrayWriter

CharArrayWriter可以在内存中创建一个Writer,它的作用实际上是构造一个缓冲区,可以写入char,最后得到写入的char[]数组

try (CharArrayWriter charArrayWriter = new CharArrayWriter()) {
    charArrayWriter.write(65);
    charArrayWriter.write(66);
    charArrayWriter.write(67);
    char[] data = charArrayWriter.toCharArray(); // { 'A', 'B', 'C' }
}

StringWriter

StringWriter是基于内存的WriterStringWriter在内部维护了一个StringBuffer,并对外提供了Writer接口。

OutputStreamWriter

除了CharArrayWriterStringWriter,普通的Writer实际上是基于OutputStream构造的,它接受char,然后在内部自动转换成一个或多个byte,并写入OutputStream。因此OutputStreamWriter就是一个将任意的OutputStream转换为Writer的转换器

try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("test_01.txt"), StandardCharsets.UTF_8)) {
    outputStreamWriter.write("hello");
}

最后更新于

这有帮助吗?