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