3

有时,知道下面一层会发生什么是一件好事,但 IMO .NET 变得如此抽象(以一种好的方式)它会使学习变得困难,因为我不明白表面之下发生了什么!

我假设 .NET 与 MS 操作系统非常耦合。因此,当使用 Directory() 或 File() 类时,我可以获得文件上的数据,并且可以理解(只是)关于它如何工作的理论。

但是,像 Java 这样的东西并不是 Windows 原生的。那么,它如何引用我硬盘上的文件呢?虽然我希望我的问题是关于任何非 Microsoft 语言的,但我限制在 Java 上以保持重点

在我看来,只有两种方法。

  1. 直接从硬盘驱动器获取文件(因此不使用操作系统。
    或者(这就是我迷路的地方)

  2. Java 运行时环境是否必须创建操作系统实例才能获取公开“HereAreTheFiles()”方法的公共方法。EG 下面的伪代码

       WindowsOS windowsOs = new WindowsOS();
       string[] files = windowsOs.GetAllFolders()
    

我希望这是有道理的。

4

3 回答 3

3

+1 好奇心。然而,我想指出,Java API 是从底层操作系统抽象出来的,但实际的 Java 运行时不是。您会注意到每个操作系统都有不同的 Java 包。因此,在幕后 Java 文件打开操作转换为用 C 编写的非常特定于操作系统的 API 调用。

于 2013-01-16T12:02:25.433 回答
3

每个操作系统都会有系统 api 来与操作系统/系统相关的任务进行交互。

在 Java 的情况下,特定于 Windows 的 JVM / JRE 正在 Windows 环境中运行。因此所有 Java System 函数都与 OS/System API 交互以进行文件读/写。

Java 提供了一个抽象层来执行这些操作,这反过来又通过调用操作系统的系统 API/本机 API 调用来实现

于 2013-01-16T12:01:33.813 回答
2

这是正在发生的一切的简单概述。

操作系统的核心是内核,所有程序都要求内核为它们做事。这包括读取文件和目录。内核处理直接从磁盘读取数据。

用户空间(即非内核)程序通过系统调用与内核通信,这些包括以特定方式设置您的 cpu 和内存,然后调用特殊的 cpu 指令。

操作系统提供了为您执行这些系统调用的库(在 C 中),您可以在自己的 C 程序中使用这些库来进行这些系统调用。在此之上还有一些库可以处理更复杂的操作。

您的 java 程序在 java 运行时中运行。这个运行时是用一种可以直接操作 cpu/内存的语言编写的(从某种意义上说,它不是在你的 java 程序所在的虚拟机后面抽象出来的)。因此,它也可以进行系统调用(它实际上与操作系统提供的库链接)。

最后,当你的java程序读取一个文件时,它会在运行时调用一个本地函数,这个函数会调用一个操作系统提供的库,这个库会进行一个系统调用,内核会处理它,内核会读取磁盘中的数据。

于 2013-01-16T12:09:33.970 回答