25.Java IO: InputStreamReader && OutputStreamWriter

来源:互联网 发布:java 垃圾回收面试 编辑:程序博客网 时间:2024/03/29 02:52

本文是在Java IO: InputStreamReader和Java IO: OutputStreamWriter翻译而来。

Java IO: InputStreamReader

Java InputStreamReader类(java.io.InputStreamReader)是用于包裹InputStream,因此将基于字节的输入流转换成基于字符的Reader。

Java InputStreamReader经常用来从文件(或者网络连接)读取字符,这些文件是字节表示的文本。例如,一个文本文件是UTF-8编码的字符。为了读取这样的文件,你可以用InputStreamReader来包裹FileInputStream。

InputStreamReader例子

下面是Java InputStreamReader的例子:

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

例子首先创建了FileInputStream,然后将它包裹成InputStreamReader。第二步,例子通过InputStreamReader从文件中读取所有的字符。

read()

InputStreamReader的read()方法返回一个int值,这个值包含了已读字符的字符值。例如:

int data = inputStreamReader.read();

你可以将返回的int值转型为char,像这样:

char aChar = (char) data;

Stream的末尾

如果read()方法返回-1,表明已到达Stream的末尾,InputStreamReader里没有更多的可读数据。-1是int值,不是字节-1.在这里是不一样的。
使用read()方法和InputStream中的read()方法一样。当到达流的末尾,可以将它关闭。

字符编码构造器

Java InputStreamReader有一系列可选择的构造器,允许你指定字符格式(ISO-Latin1,UTF-8,UTF-16等等)用于以底层InputStream解释字节。

下面是Java InputStreamReader例子,指定字符编码格式到构造器:

InputStream inputStream       = new FileInputStream("c:\\data\\input.txt");Reader      inputStreamReader = new InputStreamReader(inputStream, "UTF-8");

注意InputStreamReader构造器的第二个参数。InputStreamReader现在将用UTF-8编码格式从底层InoutStream解释字节。这样InputStream将一个接一个地解码UTF-8编码的字符,以char值返回每个字符(在已返回的int值里)。

关闭InputStreamReader

当你结束从InputStreamReader读取字符时,你应该记得关闭它。关闭InputStreamReader同时也将关闭InputStreamReader读取字符时使用的InputStream实例。
调用InputStreamReader的close()方法 就可以关闭它。例如:

inputStreamReader.close();

在java7里你也可以使用try-with-resources 。例如:

InputStream input = new FileInputStream("data/text.txt");try(InputStreamReader inputStreamReader =    new InputStreamReader(input)){    int data = inputStreamReader.read();    while(data != -) {        System.out.print((char) data));        data = inputStreamReader.read();    }}

注意这里不再有任何调用close()方法。try-with-resources 将考虑到这些。

注意FileInputStream实例也没在try-with-resources块里创建。这意味着try-with-resources块不会自动关闭这俩个FileInputStream实例。然而,当InputStreamReader关闭了,它也将关闭它读取的InputStream,所以当InputStreamReader关闭后,这个FileInputStream实例也将关闭。

Java IO: OutputStreamWriter

Java OutputStreamWriter类(java.io.OutputStreamWriter)是用于包裹OutputStream,因此将基于字节的输出流转换成基于字符的Writer。

当你需要向文件写入用例如UTF-8或UTF-16格式编码的字符时,Java OutputStreamWriter是很有用的,你可以向OutputStreamWriter写入字符(char值),然后将正确地编码它们,将编码的自己写入底层OutputStream.

OutputStreamWriter例子

下面是Java OutputStreamWriter的例子:

Here is a simple Java OutputStreamWriterexample:OutputStream outputStream       = new FileOutputStream("c:\\data\\output.txt");Writer       outputStreamWriter = new OutputStreamWriter(outputStream);outputStreamWriter.write("Hello World");outputStreamWriter.close();

字符编码构造器

Java OutputStreamWriter有一系列可选择的构造器,允许你指定字符格式(ISO-Latin1,UTF-8,UTF-16等等)用于以底层OutputStream解释字节。下面是Java OutputStreamWriter例子,指定字符编码格式到构造器:

OutputStream outputStream       = new FileOutputStream("c:\\data\\output.txt");Writer       outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

例子首先创建了outputStream,然后将所有已读字符转换成UTF-8格式字符(每个字符是一个或更多字节),然后将UTF-8编码的字节吸入底层OutputStream。

关闭OutputStreamWriter

当你结束向OutputStreamWriter写入字符时,你应该记得关闭它。关闭OutputStreamWriter同时也将关闭OutputStreamWriter读取字符时使用的OutputStream实例。
调用OutputStreamWriter的close()方法 就可以关闭它。例如:

outputStreamWriter.close();

在java7里你也可以使用try-with-resources 。例如:

OutputStream output = new FileOutputStream("data/data.bin");try(OutputStreamWriter outputStreamWriter =    new OutputStreamWriter(output)){    Person person = new Person();    person.name = "Jakob Jenkov";    person.age  = 40;    outputStreamWriter.writeObject(person);}

注意这里不再有任何调用close()方法。try-with-resources 将考虑到这些。

注意FileOutputStream实例也没在try-with-resources块里创建。这意味着try-with-resources块不会自动关闭这俩个FileOutputStream实例。然而,当OutputStreamWriter关闭了,它也将关闭它读取的OutputStream,所以当OutputStreamWriter关闭后,这个FileOutputStream实例也将关闭。

0 0
原创粉丝点击