JVM如何访问文件系统

时间:2010-02-02 19:35:56

标签: java jvm java-native-interface

我与老板争吵,他确信JVM使用JNI来访问文件系统等本地内容。我认为他错了,因为JVM本身是一个本机代码,它直接与操作系统通信 - 它不需要JNI样板来访问文件系统。

请帮我澄清JVM的工作原理

2 个答案:

答案 0 :(得分:4)

这真的是一个有点点的问题。 Java Native Interfaces是一种语言功能,允许您在Java中定义一个函数调用,该函数调用将传递给非Java的代码,特别是平台本机代码。如果您查看SDK的src.zip中的FileOutputStream.java,您将看到如下代码:

    /**
 * Opens a file, with the specified name, for writing.
 * @param name name of file to be opened
 */
private native void open(String name) throws FileNotFoundException;

/**
 * Opens a file, with the specified name, for appending.
 * @param name name of file to be opened
 */
private native void openAppend(String name) throws FileNotFoundException;

/**
 * Writes the specified byte to this file output stream. Implements 
 * the <code>write</code> method of <code>OutputStream</code>.
 *
 * @param      b   the byte to be written.
 * @exception  IOException  if an I/O error occurs.
 */
public native void write(int b) throws IOException;

所以我想说如果问题是 - 类库是否使用相同的符号来访问外部系统级库调用我认为答案是肯定的。

然而,解释java字节码并应用这些规则的Java虚拟机绝对是本机代码 - 我怀疑为了命名(不同的“本机”系统使用完全不同的API),不像本机调用直接到库,这些呼叫由VM接收并由VM处理。

答案 1 :(得分:2)

JNI用于访问本机代码的Java代码。你是对的,JVM是Native代码,所以它直接绑定到它编译的平台。这就是每个操作系统都有一个JVM的原因。 Windows JVM是针对Windows,Linux for Linux,OSX for OSX等编译的。它们将所有特定于平台的代码编译到JVM代码本身。