Java的EOF標識?

 這篇是關於JAVA中EOF標識的講解,以前在工做上碰到過一個問題,有人問過,不能經過判斷EOF來知道文件有沒有讀取完畢嗎?其實,還真不能。java

 直接從JDK接口文檔入手,以FileInputStream爲例,JDK接口文檔給出了明確的說明:linux

file

 使用FileInputStream的read方法讀取文件時,當返回-1就代表讀到了文件末尾,若是期間出現IO異常,則會拋出一個IOException。而對於EOF文件結束符,實際上是不存在的。在Linux系統之中,EOF根本不是一個字符,而是當系統讀取到文件結尾,所返回的一個信號值,例如在C語言中,EOF是一個定義在頭文件stdio.h的常量,通常等於-1。對於JAVA的實現,咱們能夠經過查看FileInputStream的源碼查看,以下:jvm

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.net

 而readSingle方法位於io_util.c中:3d

file

 搓這裏io_util.c(http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7/src/share/native/java/io/io_util.c) 跟蹤IO_Read方法,能夠獲得以下源碼實現:unix

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)blog

 因此,其實read方法最後仍是調用了操做系統的read方法,該方法跟具體的操做系統相關,在linux下,有以下的說明接口

file

 也就是,當使用read方法去讀文件時,若是讀到了文件末尾,沒有字符返回時,則該方法返回0,若是出現異常,則返回-1.而後,JDK在readSingle方法裏進行了包裝,若是返回0,則在JDK層面返回-1,若是返回-1,則拋出IOException.於是,JAVA中沒有EOF這個標識符,而是使用-1來標識文件結束。文檔

file

我的公衆號:啊駝

相關文章
相關標籤/搜索