3

時々、1層下で何が起こるかを知ることは良いことですが、IMO .NETは(良い意味で)非常に抽象的になり、表面下で何が起こっているのか理解できないため、学習が難しくなる可能性があります。

.NETはMSオペレーティングシステムと非常に連動していると思います。したがって、Directory()またはFile()クラスを使用すると、ファイルに関するデータを取得でき、ファイルがどのように機能するかについての理論を(ちょうど)理解できます。

しかし、JavaのようなものはWindowsにネイティブではありません。では、どうすればハードドライブ上のファイルを参照できますか?私の質問はMicrosoft以外の言語についてであることが望まれましたが、焦点を合わせ続けるためにJavaに限定しています。

私の頭の中では、2つの方法しかありません。

  1. ハードドライブから直接ファイルを取得します(したがって、OSを使用しないでください。
    または(これが私が迷子になっている場所です)

  2. Javaランタイム環境は、OSのインスタンスを作成して、「HereAreTheFiles()」メソッドを公開するパブリックメソッドを取得する必要がありますか。EG以下の擬似コード

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

これが理にかなっていることを願っています。

4

3 に答える 3

3

すべてのオペレーティングシステムには、OS/システム関連のタスクと対話するためのシステムAPIがあります。

Javaの場合、Windowsに固有のJVM/JREがWindows環境で実行されています。したがって、すべてのJavaシステム関数はOS /システムAPIと対話して、ファイルの読み取り/書き込みを行います。

Javaは、これらの操作を実行するための抽象化レイヤーを提供します。これは、オペレーティングシステムへのシステムAPI/ネイティブAPI呼び出しを呼び出すことによって実装されます。

于 2013-01-16T12:01:33.813 に答える
3

好奇心のために+1。ただし、Java APIは基盤となるOSから抽象化されていますが、実際のJavaランタイムは抽象化されていないことを指摘しておきます。OSごとに異なるJavaバンドルがあることに気付くでしょう。したがって、内部では、Javaファイルを開く操作は、Cで記述された非常にOS固有のAPI呼び出しに変換されます。

于 2013-01-16T12:02:25.433 に答える
2

これが起こっているすべての単純な概要です。

オペレーティングシステムの中核はカーネルであり、すべてのプログラムはカーネルにそれらのために何かをするように要求します。これには、ファイルとディレクトリの読み取りが含まれます。カーネルは、ディスクから直接データを読み取る処理を行います。

ユーザースペース(つまり、非カーネル)プログラムは、システムコールを介してカーネルと通信します。これには、特定の方法でCPUとメモリを設定してから、特別なCPU命令を呼び出すことが含まれます。

オペレーティングシステムは、これらのシステムコールを実行するライブラリ(C)を提供します。これらのライブラリを独自のCプログラムで使用して、これらのシステムコールを実行できます。より複雑なアクションを処理するライブラリもあります。

JavaプログラムはJavaランタイムで実行されます。このランタイムは、CPU /メモリを直接操作できる言語で記述されています(Javaプログラムである仮想マシンの背後に抽象化されていないという意味で)。そのため、システムコールも実行できます(実際には、OSが提供するライブラリとリンクしています)。

最後に、Javaプログラムは、ファイルを読み取るときに、ランタイムでネイティブ関数を呼び出します。この関数は、OSが提供するライブラリを呼び出し、システムコールを実行します。これは、カーネルによって処理され、ディスクからのデータ。

于 2013-01-16T12:09:33.970 に答える