2013-06-12 51 views
6

在Java中,您可以讀取和寫入文件。但是JVM可以運行在許多可能有不同存儲文件和相關數據的系統上。如何編寫適用於每個系統的JVM代碼?JVM和Java如何實現對文件的讀寫?

原生方法在什麼級別使用? JVM是否有一套必須爲每個系統實現的文件函數,然後哪些文件函數可以用任何語言調用?或者,在JVM上運行的每種語言(如Java或Scala)都必須自行完成它?

+1

的JVM包裝OS本地文件功能,對於大多數操作系統的。爲JVM編寫的語言不必擔心。 – Serdalis

+0

http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/FileSystem.java#FileSystem – SLaks

+0

@Slaks - 這只是Java代碼。本地代碼方面發生了很多。當然要做的事情與讀寫文件。 –

回答

6

通常,您將使用C++等高級語言編寫JVM,然後使用該語言提供的庫來與文件系統進行連接。然後,您可以在不同的平臺,操作系統和體系結構上編譯JVM,並且負責確定如何對高級語言編譯器執行文件I/O。

或者,對於某些操作,JVM可能會根據其上運行的操作系統具有不同的文件I/O或窗口實現。那麼將會有多種不同的實現方式,以及系統建設的JVM時,編譯器可以判斷哪一個根據config腳本中使用,或#ifdef S等

希望這有助於!

+0

好的,如果JVM爲你包裝所有特定於操作系統的東西,你如何在JVM代碼中調用/使用那些東西(比如,如果你正在編寫一個編譯器來爲新語言生成JVM代碼)?另外,這是如何讀取和寫入控制檯的工作呢? – Tespa42

1

大多數IO函數都非常標準,並且有POSIX調用可以跨多個操作系統使用。哪裏有差別,相關的代碼可以被包含或不使用C預處理器#ifndef#ifndef

+1

從我之前對OpenJDK JVM代碼庫的簡短訪問中,我得到了不同操作系統的本地代碼API的單獨實現的印象。它(在很大程度上)不僅僅是用條件編譯完成的。 –

+0

@StephenC即使在Java中也有像WindowsFileSystem和UnixFileSystem這樣的實現類,它們只能在這些系統上使用。 –

1

讀取和寫入到文件中java.io.FileInputStream中/ FileOutputStream中的類通過調用本地方法如完成

private native int readBytes(byte b[], int off, int len) throws IOException; 

private native void writeBytes(byte b[], int off, int len, boolean append) 
     throws IOException; 

這些類是相同的所有平臺只有本地方法實現differes,在我的Oracle HotSpot的是jre/bin/java.dll