Java IO 经典教程 (下) (翻译自jenkov.com)

此系列文章翻译自Jakob Jenkov的java系列教程,原文地址链接为Jakob Jenkov的教程,教程比较详细,很适合初学者!

您可以查看 Java IO 经典教程 (上) (翻译自jenkov.com)
您可以查看 Java IO 经典教程 (中) (翻译自jenkov.com)

如果您更喜欢简书的风格,也可以点击链接:此文章简书链接

InputStreamReader

Java InputStreamReader类(java.io.InputStreamReader)意图是包装了InputStream,因此将字节输入流变成基于字符的Reader。
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速去了文件中的所有内容。
注意:为了清晰起见这里忽略了一些适当的异常处理。相关的异常处理可以参考“Java IO Exception Handling”

read()

InputStreamReader的read()方法返回一个int值,表示读取的字符值,下面是相关代码:

int data = inputStreamReader.read();

你可以像下面这样把返回的int值强转成字符:

char aChar = (char) data;
流的结束

如果read()方法返回 -1,意味着流已经全部读取完毕。-1 是int值,不是byte或short类型。当流读取完毕时,就可以关闭流了

字符编码构造方法

Java InputStreamReader有许多可供选择的构造方法,允许你去指定字符集设置(ISO-Latin1, UTF-8, UTF-16 等等)。
下面是一个给构造方法传入编码格式的例子:

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

注意InputStreamReader构造方法的第二个参数。
InputStreamReader会把来自底层的InputStream字节用UTF-8编码来读取。

关闭InputStreamReader

此处的内容和其他流完全一致

OutputStreamWriter

Java OutputStreamWriter类(java.io.OutputStreamWriter)的意图是包装OutputStream,从而将字节输出流的方式转换成自己字符的Writer。
如果你想讲字符写入到文件那么OutputStreamWriter是实用的,以UTF-8 or UTF-16等编码格式。然后,您可以将字符(char值)写入OutputStreamWriter,它将正确地编码它们,并将编码的字节写入底层的OutputStream。

OutputStreamWriter例子

下面是一个简单的Java OutputStreamWriter例子:

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

outputStreamWriter.write("Hello World");

outputStreamWriter.close();

注意:上面的例子省略了必要的异常处理。学习更多的异常处理相关知识,可以参考“Java IO Exception Handling”章节。

字符编码的构造方法

OutputStreamWriter提供了一些构造方法,可以让你在初始化时设置好字符集,如ISO-Latin1, UTF-8, UTF-16等:

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

例子创建了一个OutputStreamWriter,可以把所有的字符转换为UTF-8格式的字符,并将这些字符编码的字节传入底层的OutputStream。

FileReader

FileReader类(java.io.FileReader),可以基于字符流来读取文件内容。它的工作机制类似于FileInputStream,但是FileInputStream是读取字节。换句话来说,FileReader的意图是读取文本。一个字符可能对于一个或多个字节,这取决于字符的编码格式。

FileReader例子

下面是Java FileReader的简单例子:

Reader fileReader = new FileReader("c:\\data\\input-text.txt");

int data = fileReader.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = fileReader.read();
}
fileReader.close();

例子首先创建了一个FileReader,并且在构造方法传入了一个文件路径。然后,从FileReader每次读取一个字符并读取了所有的内容,最后,将FileReader关闭。

注意:上面例子省略了必要的异常处理,更多的关于异常处理的内容,可以参考“Java IO Exception Handling”。

read()

FileReader的read()方法返回了一个int值,此值为读取的字符值。如果方法返回 -1,则代表数据已经读取完毕。

FileReader字符编码

FileReader假设你想以计算机的默认编码格式来解码文件中的字节。这并不一定是你想要的,你也改不不了这个。

如果你想指定一个不同的编码格式,就不要用FileReader了。可以在FileInputStream上使用InputStreamReader。InputStreamReader可以让你指定编码格式去读取文件的字节。

关闭FileReader

当你从FileReader读取完字符之后你要记得去关闭它。关闭FileReader可以调用close()方法。可以像下面这样来使用:

fileReader.close();

你也可以使用java 7中的 try-with-resources 结构。下面是如何使用try-with-resources来关闭流:

try(FileReader fileReader =
    new FileReader("c:\\data\\text.txt")){

    int data = fileReader.read();
    while(data != -) {
        System.out.print((char) data));
        data = fileReader.read();
    }
}

注意上面例子并没有调用close()方法。try-with-resources 结构会考虑这个的。

FileWriter

Java FileWriter类(java.io.FileWriter)可以基于字符去将数据写到文件。再这方面他更像FileOutputStream,但FileOutputStream 时基于字节的,FileWriter是基于字符的。换句话说FileWriter 的意图是去写文本。一个字符可能对于一个或多个字节,这取决于使用的字符集。

FileWriter 例子

下面是关于FileWriter的一个简单例子:

Writer fileWriter = new FileWriter("data\\filewriter.txt");

fileWriter.write("data 1");
fileWriter.write("data 2");
fileWriter.write("data 3");

fileWriter.close();

注意:上面为了简介省略了必要的异常处理。想要学习更多关于异常处理的内容,可以参开章节“Java IO Exception Handling”。

FileWriter也有其他的构造方法,让你能够指定不同的方法去写入文件。参考Java官方文档来获取更多内容。

覆盖文件 vs 向文件追加内容

当你创建了一个FileWriter,你可以决定是覆盖文件还是向已存在的文件追加内容。这是根据你选用的构造方法来决定的。

刚刚讨论的构造方法只有一个参数:文件的名称,这会覆盖已经存在的文件:

Writer fileWriter = new FileWriter("c:\\data\\output.txt");

FileWriter也有两个参数的构造方法:文件名称和一个布尔值。布尔值表名是覆盖文件还是向文件追加内容。下面是两个相关的例子:

Writer fileWriter = new FileWriter("c:\\data\\output.txt", true);  //appends to file

Writer fileWriter = new FileWriter("c:\\data\\output.txt", false); //overwrites file
FileWriter字符编码

FileWriter是假设你想以操作系统默认的编码将字节写入文件中。这不一定是你想要的,并且你不能改变这个。

如果你想指定一个不同的字符集,那么不要使用FileWriter。在FileOutputStream上使用OutputStreamWriter吧。OutputStreamWriter在写入文件的时候可以让你指定字符集。

关闭FileWriter

此章节内容和其他章节内容一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值