您的位置:首页 > 编程语言 > Java开发

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

2017-12-17 17:03 543 查看
此系列文章翻译自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

此章节内容和其他章节内容一致
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: