此系列文章翻译自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
此章节内容和其他章节内容一致