Java:IO流(三)——Reader、Writer

说明

Reader、Writer字符流,以char为单位读写;

区别于InputStream、OutputStream,后者是Byte流,以Byte为单位读写。

InputStream

Reader

字节流,以byte为单位 字符流,以char为单位
读取字节(-1,0~255):int read() 读取字符(-1,0~65535):int read()
读取字节数组:int read(byte[ ] b) 读取字符数组:int read(char[ ] c)

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)

java.io.Reader

所有字符输入流super class,它最主要的方法是:

read()

public int read() throws IOException;

该方法读取字符流下个字符;返回字符表示的int值,范围是0~65535,读到末尾则返回-1

read( char[ ] c )

public int read( char[] c ) throws IOException;

一次读取若干个字符并填充到char [ ]数组;返回实际读入的字符数,最大不超过char[ ]数组长度,返回-1表示结束。

java.io.Writer

所有字符输出流super class,主要方法有:

  • 写入单个char(0~65535):void write( int c )
  • 写入char [ ]:void write( char[ ] c )
  • 写入String:void write( String s )

实现类:Reader

1)FileReader:打开一个文件并读取所有字符

流程

1、打开文件并获取Reader;

try( Reader reader = new FileReader( "src/readme.txt" , StandardCharsets.UTF_8) ) {...}

初始化时,第二个参数为文件编码类型,缺省时可以正常打开纯ASCII编码文本文件;如果文件包含中文,就要指定编码为UTF-8

2、反复调用read()直到返回-1;

for(;;){
    int n = reader.read();
    if(n==-1) break;
    System.out.println((char)n);
}

2.5、read( char[ ] c )一次读取若干字符并填充到char [ ]数组

先设置一个缓冲区,然后每次尽可能地填充缓冲区

        try(Reader reader = new FileReader("src/readme.txt",StandardCharsets.UTF_8)){
            char [] buffer = new char [1000];
            int n;
            while((n=reader.read(buffer))!=-1)
                System.out.println("read "+n+" chars.");
        }

2)CharArrayReader:在内存中模拟Reader

类似ByteArrayInputStream,其作用实际上是把char[ ]数组变成一个Reader

try(Reader reader = new CharArrayReader("Hello.".toCharArray())){
}

在内存中模拟Reader的意思是:我们不需要从一个文件构造Reader,可以直接将一个String转换为char [ ],在将char [ ]传入并构造Reader,起到模拟从文件读取这个char[ ]的作用。

3)StringReader:类似CharArrayReader,但可以直接以String作为数据源

try( Reader reader = new StringReader("Hello")){ ... }

4)InputStreamReader

Reader本质上是一个基于InputStream的从bytechar的转换器。

InputStreamReader是一个可以把任何InputStream转换为Reader的转换器:

//InputStream
InputStream input = new FileInputStream("src/readme.txt");

//由InputStream构造Reader
Reader reader = new InputStreamReader( input , "UTF-8");

构造InputStreamReader时,我们需要传入InputStream编码,从而得到一个Reader对象。

上述代码可以用try( resource )更简洁地改写如下:

try(Reader reader = new InputStreamReader( new FileInputStream( "src/readme.txt") , "UTF-8" )){ ... }

上述代码就是FileReader的一种实现形式。

实现类:Writer

1)FileWriter:写入文件的Writer

try(Writer writer = new FileWriter("readme.txt",StandardCharsets.UTF_8)){
    writer.write('H');
    writer.write("Hello".toCharArray());
    writer.write("Hello");
}

2)CharArrayWriter:在内存中模拟Writer

在内存中模拟Writer的意思是:构造一个buffer,向其中写入char,最后得到写入的char [ ]数组(而不用输出为真正的文件),这和ByteArrayOutputStream类似。

在内存中保存Writer写入的char[ ](内存中),并不保存为真正的文件(硬盘中),这就是“模拟”的意思。

try(CharArrayWriter writer = new CharArrayWriter()){
    writer.write(65);
    writer.write(66);
    writer.write(67);
    char [] data = writer.toCharArray();
}

3)StringWriter

类似于CharArrayWriter,只不过最终在内存中维护的是StringBuffer而不是char [ ],并对外提供了Writer接口。

4)OutputStreamWriter

Reader类似,Writer实际上是基于OutputStream构造的——它接收char,在内部转换为一个或多个byte,并写入OutputStream。因此,OutputStreamWriter就是一个将任意OutputStream转换为Writer的转换器:

try(Writer writer = new OutputStreamWriter( new FileOutputStream("readme.txt"),"UTF-8" ) ){
    ...
}

上述代码就是FileWriter的一种实现方式。这与之前的InputStreamReader类似。

posted @   ShineLe  阅读(478)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示