有时候,知道下面一层发生了什么是件好事,但在我看来。net变得如此抽象(以一种好的方式),这可能会使学习变得困难,因为我不明白表面下发生了什么!
我认为。net与微软操作系统是紧密结合在一起的。因此,当使用Directory()或File()类时,我可以获得文件上的数据,并且可以理解(只是)它如何工作的理论。
但是,像Java这样的东西不是Windows原生的。那么,它如何引用我硬盘上的文件呢?虽然我希望我的问题是关于任何非微软的语言,我限制在Java,以保持它的焦点
在我看来,只有两种方法。
-
直接从硬盘获取文件(因此不使用操作系统)
或者(这就是我迷路的地方) -
Java运行时环境必须创建一个操作系统的实例,然后获得公开'HereAreTheFiles()'方法的公共方法。EG下面的伪代码
WindowsOS windowsOs = new WindowsOS(); string[] files = windowsOs.GetAllFolders()
每个操作系统都有与操作系统相关的任务交互的系统api。
在Java中,特定于Windows的JVM/JRE正在Windows环境中运行。因此,所有的Java系统函数都与OS/System api交互,以完成文件读/写。
Java提供了一个抽象层来执行这些操作,它通过调用对操作系统的系统API/本机API调用来实现
+1表示好奇。然而,我想指出的是,Java API是从底层操作系统抽象出来的,但实际的Java运行时不是。您会注意到每个操作系统都有不同的Java包。所以在幕后,Java文件打开操作转换为用c编写的非常特定于操作系统的API调用
这里是对正在发生的一切的简单概述。
操作系统的核心是内核,所有的程序都要求内核为它们做事情。这包括读取文件和目录。内核处理直接从磁盘读取数据。
用户空间(即。非内核程序通过系统调用与内核通信,这些调用包括以特定的方式设置CPU和内存,然后调用特殊的CPU指令。
操作系统为你提供了这些系统调用的库(在C中),你可以在你自己的C程序中使用这些库来进行这些系统调用。在此之上还有一些库来处理更复杂的操作。
您的java程序在java运行时中运行。这个运行时是用一种可以直接操作cpu/内存的语言编写的(从某种意义上说,它不是抽象在虚拟机后面,而java程序是)。因此,它也可以进行系统调用(它实际上链接到操作系统提供的库来执行此操作)。
最后,当java程序读取文件时,将在运行时调用一个本机函数,该函数将调用操作系统提供的库,该库将进行系统调用,该系统调用将由内核处理,该系统调用将从磁盘读取数据。