文件描述符 之於文件系統(操做系統中的一切都是文件描述符 可使用文件描述符描述任何一個資源對象
就如同Class 之於java語言同樣(java中一切都是類,都是一個Class的實例,任何一個類都用Class對象的實例來描述
|
文件描述符類的實例用做與基礎機器有關的某種結構的不透明句柄
該結構表示開放文件、開放套接字或者字節的另外一個源或接收者。
文件描述符的主要實際用途是建立一個包含該結構的 FileInputStream 或 FileOutputStream。
應用程序不該建立本身的文件描述符。
|
三個描述符,經過調用私有方法 standardStream進行建立初始化
建立一個FileDescriptor 而且,設置他的handle值
內部的set(fd)是一個本地方法
說白了,就是經過調用本地方法,得到操做系統對標準輸入/輸出/錯誤的三個文件描述符
|
註釋中也說的很清楚,文件描述符通常不直接使用 經過使用System.in System.out System.err |
在System 中 in out err 都是 final static的
|
標準的輸入輸出是共享,可是java是多線程的
所以它們必須受到特別的處理,在系統初始化完成以前,線程嚴禁使用這幾個特殊對象;
又由於這些對象都是靜態的,所以java的類加載機制會在System類加載的時候就會初始化,這就形成了一對矛盾;
爲解決這對矛盾,System在加載是將它們初始化爲null,等加在完成後,經過 initializeSystemClass
|
initializeSystemClass 方法的關鍵部位 以及 本地的setIn0 setOut0 setErr0
|
initializeSystemClass 方法對於這塊來講,主要就是
使用三個文件描述符 建立了 FileInputStream 以及 FileOutputStream
對於Out以及Err又根據encoding 轉換爲PrintStream
而後經過本地方法進行設置
|
因此說,那三個專門的文件描述符通常不直接使用 取而代之的則是使用文件描述符 初始化設置過的流對象 |
應用程序不建立文件描述符, 都是由系統調用, 也就是本地方法來操做的
應用程序只是得到, 而後使用, 所謂使用,最終也仍是須要藉助於操做系統
是應用程序 操做文件 時 與操做系統進行交互時,必須的數據項
|