Java FileReader
Java FileReader类java.io.FileReader
使读取文件内容成为字符流成为可能。除了FileInputStream读取字节,而FileReader读取字符外,它的工作方式与FileInputStream相似。换句话说," FileReader"旨在读取文本。根据字符编码方案,一个字符可以对应一个或者多个字节。
JavaFileReader
是Java Reader类的子类,因此它具有许多相同的方法。
Java 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构造函数。其次,该示例一次从FileReader中读取所有字符一个char。第三,FileReader
被关闭。
注意:为清楚起见,此处已跳过适当的异常处理。要了解有关正确的异常处理的更多信息,请转到Java IO异常处理。
read()
JavaFileReader
的read()
方法返回一个int值,其中包含所读取字符的char值。如果read()
方法返回-1,则FileReader
中不再有要读取的数据,可以将其关闭。也就是说,-1作为int值,而不是-1作为字节值。这里有区别!这是一个从JavaFileReader
读取字符直到没有更多字符可读取的示例:
FileReader fileReader = new FileReader("c:\data\input-text.txt"); int data = fileReader.read(); while(data != -1) { data = fileReader.read(); }
这个例子仅从FileReader
中读取字符,但实际上并没有对它们做任何事情。
read(char [])
JavaFileReader
还有一种方法可以读取一个字符数组,而不是一次读取一个字符。这是将多个字符读入一个char数组的示例:
FileReader fileReader = new FileReader("c:\data\input-text.txt"); char[] destination = new char[1024]; int charsRead = fileReader.read(destination, 0, destination.length);
这个read(char [])方法使用char数组将字符读取为第一个参数,将字符写入数组的偏移量以及要写入的最大字符长度。 read(char [])方法返回实际读取到char数组中的字符数。如果文件中的字符数少于指定的最大字符数,则读取的字符数将少于最大字符数。否则," read(char [])"方法将尝试将最大字符数读取到数组中。
读取的性能
一次读取一个字符数组比一次从JavaFileReader
读取单个字符要快。通过读取字符数组而不是一次读取单个字符,该差异很容易成为性能提高的10倍或者更多。
所获得的确切速度取决于读取的char
数组的大小以及运行代码的计算机的OS,硬件等。在决定之前,我们应该研究目标系统的硬盘缓冲区大小等。但是,如果缓冲区大小为8KB或者更高,则可以实现很好的加速。但是,一旦char
数组超出了底层操作系统和硬件的容量,我们将不会从更大的char
数组中获得更大的加速。
我们可能必须尝试不同的字节数组大小并测量读取性能,以找到最佳的" char"数组大小。
通过BufferedReader进行透明缓冲
我们可以使用Java BufferedReader从FileReader
添加透明的自动读取和缓冲字节数组。 BufferedReader从底层的FileReader读取char块到char数组中。然后,我们可以从" BufferedReader"中逐个读取字节,并且仍然可以从读取" chars"数组而不是一次读取一个字符中获得很大的提速。这是将JavaFileReader
包装在BufferedReader
中的示例:
Reader input = new BufferedReader( new FileReader("c:\data\input-file.txt"), 1024 * 1024 /* buffer size */ );
注意," BufferedReader"是" Reader"的子类,可以在任何可以使用" Reader"的地方使用。
FileReader字符编码
JavaFileReader
假定我们要使用运行应用程序的计算机的默认字符编码来解码文件中的字节。这可能并不总是我们想要的,并且我们无法更改它!
如果要指定其他字符解码方案,请不要使用FileReader
。请改为在FileInputStream
上使用Java InputStreamReader。 InputStreamReader允许我们指定在读取基础文件中的字节时要使用的字符编码方案。
关闭FileReader
当我们从JavaFileReader
中读取完字符后,我们应该记住将其关闭。关闭FileReader是通过调用其close()方法来完成的。这是关闭JavaFileReader
的样子:
fileReader.close();
我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭FileReader
外观的方法:
try(FileReader fileReader = new FileReader("c:\data\text.txt")){ int data = fileReader.read(); while(data != -) { System.out.print((char) data)); data = fileReader.read(); } }
注意如何不再对FileReader实例进行任何显式的close()方法调用。 try-with-resources构造可以解决这一问题。