系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

目录:系统学习 Java IO---- 目录,概览

Reader

Reader 类是 Java IO API 中所有 Reader 子类的基类。 Reader 类似于 InputStream ,除了它是基于字符而不是基于字节的。 换句话说,Java Reader 用于读取文本,而 InputStream 用于读取原始字节。

Writer

Writer 类是 Java IO API 中所有 Writer 子类的基类。 Writer 就像一个 OutputStream ,除了它是基于字符而不是基于字节的。 换句话说,Writer 用于写入文本,而 OutputStream 用于写入原始字节。
Writer 通常连接到某些数据目标,如文件,字符数组,网络套接字等。

Unicode中的字符

许多应用程序使用 UTF(UTF-8或UTF-16)来存储文本数据。 可能需要一个或多个字节来表示 UTF-8 中的单个字符。 在 UTF-16 中,每个字符需要 2 个字节来表示。 因此,在读取或写入文本数据时,数据中的单个字节可能与 UTF 中的一个字符不对应。 如果只是通过 InputStream 一次读取或写入 UTF-8 数据的一个字节,并尝试将每个字节转换为字符,可能不会得到正确的文本。

Reader 类能够将字节解码为字符。 只需要告诉Reader要解码的字符集。 这是在实例化 Reader 时执行的(当实例化其中一个子类时)。 通常会直接使用 Reader 子类而不是 Reader。Writer 同理。

读取

部分方法如下:
|方法|描述|
|-|-|
| void mark(int readAheadLimit) | 标记流中的当前位置。
| int read() | 读取单个字符。
| int read(char[] cbuf) |将字符读入数组。
|abstract int read(char[] cbuf, int off, int len) | 将字符读入数组的某一部分。
| int read(CharBuffer target) | 试图将字符读入指定的字符缓冲区。
|boolean ready() | 判断是否准备读取此流。

具体的使用需要参考对应的子类。

和 InputStream 类似,如果 read() 方法返回 -1 ,则 Reader 中没有更多数据要读取,并且可以关闭它。-1 作为 int 值,而不是-1作为byte或char值。

将字节流包装成字符流 InputStreamReader/OutputStreamWrite InputStreamReade

InputStreamReade 类用于包装 InputStream ,从而将基于字节的输入流转换为基于字符的 Reader 。 换句话说,InputStreamReader 将 InputStream 的字节解释为文本而不是数字数据,是字节流通向字符流的桥梁。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

通常用于从文件(或网络连接)中读取字符,其中字节表示文本。 例如,一个文本文件,其中字符编码为 UTF-8 。 可以使用InputStreamReader 来包装 FileInputStream 以读取此类文件。
一个示例如下:

InputStream inputStream = new FileInputStream("D:\\test\\1.txt"); Reader inputStreamReader = new InputStreamReader(inputStream); int data = inputStreamReader.read(); while (data != -1) { char c = (char) data; System.out.print(c); data = inputStreamReader.read(); } inputStreamReader.close();

首先创建一个 FileInputStream ,然后将其包装在 InputStreamReader 中。 其次,该示例通过InputStreamReader 从文件中读取所有字符.
注意:为清楚起见,此处已跳过正确的异常处理。 要了解有关正确异常处理的更多信息,请转至目录的 Java IO 异常处理。

指定字符集

底层 InputStream 中的字符将使用某些字符编码进行编码。 此字符编码称为字符集,Charset。 两种常用字符集是 ASCII 和 UTF8(在某些情况下为UTF-16)。

默认字符集可能因为环境不同而不同,所以建议告诉 InputStreamReader 实例 InputStream 中的字符用什么字符集进行编码。 这可以在 InputStreamReader 构造函数中指定,可以只提供字符集的名字字符串,在底层会调用Charset.forName("UTF-8")进行转换的。 以下是设置Java InputStreamReader使用的字符集的示例:

InputStream inputStream = new FileInputStream("D:\\test\\1.txt"); Reader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); 关闭 InputStreamReader

同样建议使用 Java try with resources 来关闭流。

try(InputStreamReader inputStreamReader = new InputStreamReader(input)){ int data = inputStreamReader.read(); while(data != -) { System.out.print((char) data)); data = inputStreamReader.read(); } } OutputStreamWriter

OutputStreamWriter 类用于包装 OutputStream ,从而将基于字节的输出流转换为基于字符的 Writer 。

如果需要将字符写入文件,OutputStreamWriter 非常有用,例如编码为 UTF-8或UTF-16。 然后可以将字符(char值)写入 OutputStreamWriter ,它将正确编码它们并将编码的字节写入底层的 OutputStream 。
一个简单的示例如下:

OutputStream outputStream = new FileOutputStream("D:\\test\\1.txt"); Writer outputStreamWriter = new OutputStreamWriter(outputStream); outputStreamWriter.write("Hello OutputStreamWriter"); outputStreamWriter.close();

注意:为清楚起见,此处已跳过正确的异常处理。 要了解有关正确异常处理的更多信息,请转至目录的 Java IO 异常处理。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxsy.html