2013-06-12 4 views
6

Javaでは、ファイルの読み書きができます。しかし、JVMは、ファイルや関連するデータを格納する方法が異なる多くのシステム上で実行できます。すべてのシステムで動作するJVMコードをどのように記述しますか?JVMとJavaはファイルの読み書きをどのように実装していますか?

ネイティブメソッドはどのレベルで使用されていますか? JVMには、システムごとに実装する必要のあるファイル機能のセットがありますか?どの言語でも呼び出すことができますか?あるいは、JVM上で動作する各言語(Java、Scalaなど)は、それ自体で行う必要がありますか?

+1

jre/bin/java.dllライブラリのJVMは、ほとんどのOS用の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を作成し、その言語で提供されたライブラリを使用してファイルシステムとのインタフェースを行います。次に、さまざまなプラットフォーム、OS、およびアーキテクチャー上でJVMをコンパイルし、高水準言語コンパイラーへのファイルI/Oの実行方法を決定する責任を任せます。

また、特定の操作では、実行されているオペレーティングシステムに基づいて、JVMにファイルI/Oまたはウィンドウの実装が異なる場合があります。複数の異なる実装が存在し、システム上にJVMを構築する場合、コンパイラはconfigスクリプト、または#ifdefなどに基づいてどちらを使用するかを決定できます。

希望します。

+0

JVMがすべてのOS固有のものをラップすると、JVMコードでそのことをどのように呼び出し/使用するのですか(新しい言語のJVMコードを生成するコンパイラを作成している場合など)?また、これはコンソールからの読み書き方法も同じですか? – Tespa42

1

ほとんどのIO機能はかなり標準的で、複数のオペレーティングシステムで動作するPOSIX呼び出しがあります。相違がある場合は、Cプリプロセッサを使用してコードを含めるかどうかを指定することができます。と#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すべてのプラットフォームで同じです、私のオラクルのHotSpotで、それは

関連する問題