gpt4 book ai didi

java - java源码最终是如何与文件交互的?

转载 作者:行者123 更新时间:2023-12-03 21:24:02 24 4
gpt4 key购买 nike

我一直想知道 java 编译器/解释器如何设法提供字节码/源代码与文件输入和输出之间的交互。

我了解到InputStream和OutputStream是所有文件I/O类的父类(super class),但是通读之后,它们并没有提供基本的文件交互方法(read()和write(byte b))的实现。我最初的想法是,也许编译器会将这些方法翻译成特定的字节码操作(从文件返回一个字节或将一个字节写入文件),这些操作只发生在这种情况下,但这可能是不正确的。

如果 Java 被编译为汇编,那么我知道某个指令将被翻译成特定于平台的文件 i/o 代码(例如 cout << ... 在 C 中),但这显然(afaik)不是Java 的情况,因为它被编译为字节码。

谁能教教我?

最佳答案

InputStreamOutputStream 类本身不提供任何实现。它们都是抽象类,需要派生类来提供实现。例如,InputStream类的read()方法is an abstract method :

public abstract int read() throws IOException

现在,派生类可以以任何它认为合适的方式提供实现,但是您是正确的,低级操作(例如需要访问系统调用的操作)最终需要一些不能单独用纯 Java 实现的引导代码.

例如,如果您查看 source code for FileInputStream , 你会看到它的 read() 方法被声明为 native:

public
class FileInputStream extends InputStream
{
/* (...) */

public native int read() throws IOException;

/* (...) */
}

由于 FileInputStream 是核心 Java 类,JVM 可能会走一些捷径,但实现 native 方法的典型方式是通过 Java Native Interface (JNI) . JNI 使得提供用不同语言(例如 C)编写的 Java 方法的实现成为可能。

这一切如何组合在一起?当你编译一个使用 FileInputStreamread() 方法的类时,就编译器而言,你只是在使用某个类的一些方法,而字节码将与任何其他方法和类相同。在运行时,当您的调用被执行时,JVM 之前加载了 FileInputStream 类,知道您正在调用的方法是 native 方法,并调用其 native 实现。

关于java - java源码最终是如何与文件交互的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27713406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com