要想对文件进行读取,就需要一个用file对象构造一个Scanner对象,如下所示
Scanner in = new Scanner(Paths.get("car.txt"), "UTF-8");
如果文件名包含反斜杠符号,就要在每个反斜杠后面再加一个额外的反斜杠:
"c:\\mydir\\myfile.txt"。
在这里,我们制定了UTF8字符编码,这对于互联网上的文件很常见(不过并不是普遍适用的)。读取一个文本文件的时候,要知道它的字符编码。如果省略字符编码,则会适用运行这个java程序的机器的“默认编码”。这并不是一个好主意,如果在不同的机器上读取这个文件,可能会有不同的结果。
现在,就可以利用任何一个Scanner方法对文件进行读取。最常用的几个方法如下:
1. String nextLine()
读取下一行的内容。
2. String next()
读取下一个单词(已空格作为分隔符)。
3. int nextInt()
double nextDouble()
读取并转换下一个表示整数或者浮点数的字符序列。
4. boolean hasnext()
检测输入中是否还有其他单词。
5. boolean hasNextInt()
boolean hasNextDouble()
检测输入中是否还有表示整数或浮点数的下一个字符序列。
要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件的名称:
PrintWriter out = new PrintWriter("myfile.txt", "UTF-8");
如果说不存在该文件,就会自动创建该文件。我们可以像输出到System.out(控制台)一样使用println()、print()、printf()等命令。
这里需要注意的就是,当指定一个文件的相对文件名时,例如,"myfile.txt"、"../myfile.txt",文件位于java虚拟机启动路径的相对位置。如果使用命令行方式启动程序,例如
java myfile
启动路径就是命令解释器的当前路径。然而,如果使用集成开发环境,那么启动路径将由IDE控制。在IDE下,我们可以使用下面的语句来得到我们的启动路径:
String dir = System.getProperty("user.dir");
此时字符串dir中就是IDE的启动路径,只要是读取的文件在这个启动路径下,我们就可以使用文件的相对文件名。
如果不想这么麻烦,我们也可以使用文件的绝对文件名称。例如:
"/home/me/practice_java/prac1/myfile.txt"。
需要注意的是,如果用一个不存在的文件名去构造一个Scanner对象,或者用一个不能被创建的文件名(例如中文来命名文件)构造一个PrintWriter对象,就会发生异常。java认为这些异常比“被零除”更严重,所以我们应当告诉编译器:已经有可能知道会出现输入输出异常。中需要在main方法中用throws子句标记,如下:
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(Paths.get("/home/me/files/car.txt"), "UTF-8");
String dir = System.getProperty("user.dir");
System.out.println(dir);
}