2013-01-16 37 views
3

有時,知道底層1層是好事情,但IMO .NET變得如此抽象(以一種好的方式),它可以使學習變得困難,因爲我不明白表面下面發生了什麼!軟件如何引用硬盤驅動器上的文件

我假設.NET與MS操作系統非常耦合。所以,當使用Directory()或File()類時,我可以獲得關於該文件的數據,並且可以理解(僅)關於它如何工作的理論。

但是,像Java這樣的東西不是Windows原生的。那麼,它如何引用我硬盤上的文件呢?儘管我希望我的問題是關於任何非微軟語言,但我只限於Java保持專注。

在我的腦海裏,只有兩種方式。

  1. 獲取文件從硬盤直接的(因此不使用OS。
    OR(而這正是我迷路)

  2. 請問Java運行時環境,必須創建一個操作系統的實例,然後得到它公開了一個「HereAreTheFiles()」公共方法方法。EG下面的僞代碼

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

希望這是有道理的。

回答

2

下面簡要介紹一切正在進行的操作。

操作系統的核心是內核,所有程序都要求內核爲他們做事。這包括讀取文件和目錄。內核直接從磁​​盤讀取數據。

用戶空間(即非內核)程序通過系統調用與內核通信,這些包括以特定方式設置你的cpu和內存,然後調用特殊的cpu指令。

操作系統爲您提供了這些系統調用的庫(在C中),您可以在您自己的C程序中使用這些庫來進行這些系統調用。還有一些庫可以處理更復雜的操作。

您的java程序在java運行時運行。這個運行時是用一種可以直接操縱CPU /內存的語言編寫的(從它的意思是它不是在你的Java程序所在的虛擬機後面抽象出來的)。因此,它也可以進行系統調用(它實際上與操作系統提供的庫鏈接)。

最後,你的java程序,當讀取一個文件時,將調用在運行原生功能,這將調用操作系統提供的庫,這將會使一個系統調用,這將是由內核來處理,它將從磁盤讀取數據。

+0

因此,運行時是否會被寫入多次,每個操作系統一次,然後允許Java保持不變(在語法/語言方面)。 – Dave

+0

雖然在C標準庫中標準化了閱讀文件和輸出文本等基本操作,對於像java這樣的東西,可能有很多操作系統特定的代碼。 – yiding

3

每個操作系統都有系統apis來與OS /系統相關的任務進行交互。

在Java情況下,特定於Windows的JVM/JRE正在Windows環境上運行。所以所有的Java系統函數都與OS/System API進行交互以進行文件讀/寫。

Java提供抽象執行這些操作層,其中inturn它實現通過調用好奇心的系統API /原生API調用操作系統

3

+1。不過,我想指出的是,Java API是從底層操作系統抽象出來的,但實際的Java運行時不是。您會注意到每個操作系統都有不同的Java捆綁包。因此,Java文件打開操作將轉化爲以C語言編寫的非常特定於OS的API調用。

+0

是的,每個版本的JRE都會調用系統特定/本機庫來執行特定於操作系統的任務 – TheWhiteRabbit

+0

因此,我認爲運行時是使用MS技術編寫的Java在Windows上運行時運行的嗎? – Dave

+0

或多或少。在這些版本之間有大量的共享代碼,Windows版本在一些地方使用WinAPI,否則就無法以標準的POSIX方式完成。 – maksimov

相關問題