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. github上传自己的开源代码 – limingyue

    github上传自己的开源代码 之前曾用Github上传过自己的代码,但是一个很繁琐的过程,后来就没有持续的开 […]...

  2. 腾讯云Ubuntu Server 18.04.1 LTS 64安装图像化桌面

    安装命令1. sudo apt-get install xinit 2. sudo apt-get insta […]...

  3. Azkaban,Sqoop讲义

    Day 07 1. Azkaban介绍 1.1. 为什么需要Azkaban 一个完整的数据分析系统通常都是由大 […]...

  4. 如何在Gmail中插入简历照片(刚刚搞定 分享一下)

    看看这个 如何在Gmail中插入简历照片(刚刚搞定 分享一下)Gmail发送邮件一般不会出什么问题,比如发送文 […]...

  5. 协方差矩阵(基础知识)

    参考来源:http://pinkyjie.com/2010/08/31/covariance/ 我们知道标准差 […]...

  6. 2 jQuery 选择器

    1 基础和层级选择器alex张三李四...

  7. 思维导图学《On Java》基础卷

    说明原来读过 《Java 编程思想(第 4 版)》,但是这个版本还是基于 Java 5 讲解。由于 Java 8 做出了非常大的改进(是 Java 变化最大的版本),且截止到 2022-07-22,Java 版本都更新到 18 了……原...

  8. 外呼系统APP外呼软件手机电销软件拨号销售软件功能设计

    电销软件APP外呼软件拨号销售软件 系统概述该电销软件主要是为贷款、投资、资产管理等金融中介公司提供方便快捷的 […]...

展开目录

目录导航