Java核心技术卷I基础知识3.7.3 文件输入与输出
3.7.3 文件输入与输出
要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:
如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠: “c:\\mydirectory\\myf?ile.txt”。
注释:在这里指定了UTF-8字符编码,这对于互联网上的文件很常见(不过并不是普遍适用)。读取一个文本文件时,要知道它的字符编码——更多信息参见卷Ⅱ第2章。如果省略字符编码,则会使用运行这个Java程序的机器的“默认编码”。这不是一个好主意,如果在不同的机器上运行这个程序,可能会有不同的表现。
现在,就可以利用前面介绍的任何一个Scanner方法对文件进行读取。
要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名:
如果文件不存在,创建该文件。可以像输出到System.out一样使用print、println以及printf命令。
警告:可以构造一个带有字符串参数的Scanner,但这个Scanner将字符串解释为数据,而不是文件名。例如,如果调用:
这个scanner会将参数作为包含10个字符的数据:‘m’,‘y’,‘f’等。在这个示例中所显示的并不是人们所期望的效果。
注释:当指定一个相对文件名时,例如,“myf?ile.txt”,“mydirectory/myf?ile.txt”或“../myf?ile.txt”,文件位于Java虚拟机启动路径的相对位置。如果在命令行方式下用下列命令启动程序:
启动路径就是命令解释器的当前路径。然而,如果使用集成开发环境,那么启动路径将由IDE控制。可以使用下面的调用方式找到路径的位置:
如果觉得定位文件比较烦恼,则可以考虑使用绝对路径,例如:“c:\\mydirectory\\ myf?ile.txt”或者“/home/me/mydirectory/myf?ile.txt”。
正如读者所看到的,访问文件与使用System.in和System.out一样容易。要记住一点:如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。Java编译器认为这些异常比“被零除”异常更严重。在第7章中,将会学习各种处理异常的方式。现在,应该告知编译器:已经知道有可能出现“输入/输出”异常。这需要在main方法中用throws子句标记,如下所示:
现在读者已经学习了如何读写包含文本数据的文件。对于更加高级的技术,例如,处理不同的字符编码、处理二进制数据、读取目录以及写压缩文件,请参看卷Ⅱ第2章。
注释:当采用命令行方式启动一个程序时,可以利用Shell的重定向语法将任意文件关联到System.in和System.out:
这样,就不必担心处理IOException异常了。
java.util.Scanner 5.0
Scanner(File f)
构造一个从给定文件读取数据的Scanner。
Scanner(String data)
构造一个从给定字符串读取数据的Scanner。
java.io.PrintWriter 1.1
PrintWriter(String f?ileName)
构造一个将数据写入文件的PrintWriter。文件名由参数指定。
java.nio.f?ile.Paths 7
static Path get(String pathname)
根据给定的路径名构造一个Path。
相关文章
- Java要抛弃祖宗的基业,Java程序员危险了!
- 十大 Java 语言特性
- JVM 三色标记算法,原来是这么回事!
- 聊聊 Spring 事务控制策略以及 @Transactional 失效问题避坑
- 写给 Java 程序员的前端 Promise 教程
- 写给 Java 程序员的前端 Promise 教程,你学会了吗?
- Java 中为什么不全部使用 Static 方法?
- Java 池化技术你了解多少?
- Java 服务 Docker 容器化优秀实践
- Spring Boot + EasyExcel导入导出,简直太好用了!
- 我们一起聊聊 Java 内存泄漏
- CentOS 下安装 Docker 极简教程
- JDK 19 功能集冻结:Java 19 只有七个新特性
- 关于 CMS 垃圾回收器,你真的懂了吗?
- 为什么会有这么多编程语言?
- 改善Java代码的八个建议
- 接口流量突增,如何做好性能优化?
- Java 以编程方式创建JAR文件
- POJO、Java Bean是如何定义的
- Spring 的 Bean 明明设置了 Scope 为 Prototype,为什么还是只能获取到单例对象?