Java的EOF标识?

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 啊驼 阅读() 评论() 编辑 收藏

 

版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:

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

  1. Java的EOF标识?

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

随机推荐

  1. 华为鸿蒙系统开发初体验

    前言 各位同学大家好 有段时间没有给大家更新文章了, 昨天12月16 日华为发布了鸿蒙os2.0 bate 版 […]...

  2. Java中的事务——JDBC事务和JTA事务

    本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。 Java事务的类型有 […]...

  3. GitLab基本用法

    通过本文,你可以学习到三点内容:1. Windows下如何连接GitLab;2.如何在GitLab中新建群组和 […]...

  4. Redis(5)——亿级数据过滤和布隆过滤器

    一、布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以 […]...

  5. USB接口 – 樊四郎

    USB接口    总结: 1、电脑的usb接口是usb母接口,u盘接口是usb公接口 2、usb otg指的是 […]...

  6. Android Gradle脚本从Groovy迁移到Kotlin DSL

    Android Gradle从Groovy迁移到Kotlin Android项目用Gradle构建, 其脚本语 […]...

  7. 羽夏看Linux内核——启动那些事

    写在前面此系列是本人一个字一个字码出来的,包括示例和实验截图。如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事...

  8. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令。 在 […]...

展开目录

目录导航