Java的EOF标识?

cxyAtuo 2019-09-29 原文

Java的EOF标识?

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

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

file

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

file

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

file

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

 而readSingle方法位于io_util.c中:

file

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

file

file

 源文件分别位于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下,有如下的说明

file

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

file

个人公众号:啊驼

发表于
2019-09-29 09:14 啊驼 阅读() 评论() 编辑 收藏

 

版权声明:本文为cxyAtuo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cxyAtuo/p/11605902.html

Java的EOF标识?的更多相关文章

  1. Java的EOF标识?

    Java的EOF标识?  这篇是关于JAVA中EOF标识的讲解,之前在工作上碰到过一个问题,有人问过,不能通过 […]...

随机推荐

  1. 模仿虎牙幻灯片使用面向对象思想封装的插件

         虎牙是一个直播网站,很多年轻人都喜欢的网站。那天我看到虎牙的幻灯片做的挺好看的,于是就模仿着谢了一个 […]...

  2. 大数据开发实战:离线大数据处理的主要技术–Hive,概念,SQL,Hive数据库

    大数据开发实战:离线大数据处理的主要技术–Hive,概念,SQL,Hive数据库   1、Hive […]...

  3. hadoop优化

    0) HDFS小文件影响:(1)影响 NameNode 的寿命,因为文件元数据存储在 NameNode 的内存 […]...

  4. 在线制作思维导图,在线制作矢量图形

    话说老外做的工具就是好用 思维导图: https://coggle.it/ 制作矢量图形 : http://a […]...

  5. win10 禁ping如何设置,如何开启禁ping功能?

    摘自:https://jingyan.baidu.com/article/fc07f989ac7fd412ff […]...

  6. 两个超大的数字相加

    function largeCount(f, t) { f += ""; t += ""; let fl = […]...

  7. 谷歌应用商店速度慢的解决办法

    我以前发过一个解决火狐浏览器附加组件网站速度慢的解决方法,其实今天要说的谷歌应用商店速度慢的解决办法和火狐的方 […]...

  8. python3解析库pyquery

    pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyque […]...

展开目录

目录导航