Java的EOF标识

46次阅读

共计 1150 个字符,预计需要花费 3 分钟才能阅读完成。

 这篇是关于 JAVA 中 EOF 标识的讲解,之前在工作上碰到过一个问题,有人问过,不能通过判断 EOF 来知道文件有没有读取完毕吗?其实,还真不能。

 直接从 JDK 接口文档入手,以 FileInputStream 为例,JDK 接口文档给出了明确的说明:

 使用 FileInputStream 的 read 方法读取文件时,当返回 - 1 就表明读到了文件末尾,如果期间出现 IO 异常,则会抛出一个 IOException。而对于 EOF 文件结束符,其实是不存在的。在 Linux 系统之中,EOF 根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值,例如在 C 语言中,EOF 是一个定义在头文件 stdio.h 的常量,一般等于 -1。对于 JAVA 的实现,我们可以通过查看 FileInputStream 的源码查看,如下:

 其中 read0 为 native 方法,需要查看 jvm 源码。根据 JVM 源码定位进去,发现 read0 调用 readSingle 方法:

 源码看这 FileInputStream.c(http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7/src/share/native/java/io/FileInputStream.c)

 而 readSingle 方法位于 io_util.c 中:

 搓这里 io_util.c(http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7/src/share/native/java/io/io_util.c)
跟踪 IO_Read 方法,可以得到如下源码实现:

 源文件分别位于 io_util_md.h(http://hg.openjdk.java.net/jdk/jdk/file/bd45ce23b1ac/src/java.base/unix/native/libjava/io_util_md.h) 和 io_util_md.c(http://hg.openjdk.java.net/jdk/jdk/file/bd45ce23b1ac/src/java.base/unix/native/libjava/io_util_md.c)

 所以,其实 read 方法最后还是调用了操作系统的 read 方法, 该方法跟具体的操作系统相关,在 linux 下,有如下的说明

 也就是,当使用 read 方法去读文件时,如果读到了文件末尾,没有字符返回时,则该方法返回 0,如果出现异常,则返回 -1. 然后,JDK 在 readSingle 方法里进行了包装,如果返回 0,则在 JDK 层面返回 -1,如果返回 -1,则抛出 IOException. 因而,JAVA 中没有 EOF 这个标识符,而是使用 - 1 来标识文件结束。

个人公众号:啊驼

正文完
 0