3.7.3 文件输入与输出

要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:

如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠:“c:\\mydirectory\\myfile.txt”。

现在,就可以利用前面介绍的任何一个Scanner方法对文件进行读取。

要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名:

如果文件不存在,创建该文件。可以像输出到System.out一样使用print、println以及printf命令。

警告:可以构造一个带有字符串参数的Scanner,但这个Scanner将字符串解释为数据,而不是文件名。例如,如果调用:

这个scanner会将参数作为包含10个字符的数据:‘m’,‘y’,‘f’等。在这个示例中所显示的并不是人们所期望的效果。

注释:当指定一个相对文件名时,例如,“myfile.txt”,“mydirectory/myfile.txt”或“../myfile.txt”,文件位于Java虚拟机启动路径的相对位置。如果在命令行方式下用下列命令启动程序:

启动路径就是命令解释器的当前路径。然而,如果使用集成开发环境,那么启动路径将由IDE控制。可以使用下面的调用方式找到路径的位置:

如果觉得定位文件比较烦恼,则可以考虑使用绝对路径,例如:“c:\\mydirectory\\myfile.txt”或者“/home/me/mydirectory/myfile.txt”。

正如读者所看到的,访问文件与使用System.in和System.out一样容易。要记住一点:如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。Java编译器认为这些异常比“被零整除”异常更严重。在第11章中,将会学习各种处理异常的方式。现在,应该告知编译器:已经知道有可能出现“找不到文件”的异常。这需要在main方法中用throws子句标记,如下所示:

现在读者已经学习了如何读写包含文本数据的文件。对于更加高级的技术,例如,处理不同的字符编码、处理二进制数据、读取目录以及编写压缩文件,请参看卷II第1章。

注释:当采用命令行方式启动一个程序时,可以利用重定向将任意文件捆绑到System.in和System.out:

这样,就不必担心处理FileNotFoundException异常了。

API java.util.Scanner 5.0

·Scanner(File f)

构造一个从给定文件读取数据的Scanner。

·Scanner(String data)

构造一个从给定字符串读取数据的Scanner。

API java.io.PrintWriter 1.1

·PrintWriter(String fileName)

构造一个将数据写入文件的PrintWriter。文件名由参数指定。

API java.nio.file.Paths 7

·static Path get(String pathname)

根据给定的路径名构造一个Path。