国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

通過Java IO流的形式實現鍵盤錄入的疑問

瀏覽:70日期:2023-12-31 15:18:24

問題描述

通過Java IO流的形式實現鍵盤錄入的疑問

問題解答

回答1:

因為System.in就是一個靜態的InputStream實例,你可以在java api文檔上看看

回答2:

首先,System.in是一個InputStream類型的對象,在源碼里是這樣的:

/** * The 'standard' input stream. This stream is already * open and ready to supply input data. Typically this stream * corresponds to keyboard input or another input source specified by * the host environment or user. */public final static InputStream in = null;

可見System.in屬于標準輸入,可以通過鍵盤或其他方式輸入數據。但在源碼里,該對象并沒有(顯式)初始化的方法,通過閱讀源碼,可發現下面這個方法:

/** * Reassigns the 'standard' input stream. * * <p>First, if there is a security manager, its <code>checkPermission</code> * method is called with a <code>RuntimePermission('setIO')</code> permission * to see if it’s ok to reassign the 'standard' input stream. * <p> * * @param in the new standard input stream. * * @throws SecurityException *if a security manager exists and its *<code>checkPermission</code> method doesn’t allow *reassigning of the standard input stream. * * @see SecurityManager#checkPermission * @see java.lang.RuntimePermission * * @since JDK1.1 */public static void setIn(InputStream in) { checkIO(); setIn0(in);}private static native void setIn0(InputStream in);

閱讀注釋可見該方法用于設定研究setIn0(in),可見該方法是通過調用底層接口來實現in的設定,那么在軟件運行時,是如何初始化的呢?System類中有如下代碼:

/* register the natives via the static initializer. * * VM will invoke the initializeSystemClass method to complete * the initialization for this class separated from clinit. * Note that to use properties set by the VM, see the constraints * described in the initializeSystemClass method. */private static native void registerNatives();static { registerNatives();}/** * Initialize the system class. Called after thread initialization. */private static void initializeSystemClass() {...FileInputStream fdIn = new FileInputStream(FileDescriptor.in);FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);setIn0(new BufferedInputStream(fdIn));setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));...}

由此段代碼可知,軟件運行時,先運行靜態代碼塊,調用registerNatives()這個底層方法對System類進行初始化,該方法則是調用initializeSystemClass()方法來初始化System類的,這兩步都是通過VM實現的,然后閱讀initializeSystemClass()這個方法,可見到調用setIn0,setOut0,steErr0三段代碼,分別初始化了標準輸入,標準輸出,標準錯誤三種輸出流,至此System.in、out、err的初始化流程就都弄清楚了。標記為native的方法是JVM調用其他代碼實現的功能,這個和底層有關系,我覺得這個感覺就像是Bootstrap Classloader實際上是C實現,但由JVM調用來加載各個基礎JAR classes相似吧。另外你說InputStream是抽象類(接口),實際上接口類抽象類都可以作為參數,但實現肯定不是他們實現的,他們不能被實現,但可以作為參數,畢竟父類出現的地方子類都可以替代,所以這里不存在問題

標簽: java
相關文章:
主站蜘蛛池模板: 亚洲欧美在线视频免费 | 国产一级一片免费播放 | 99久久国产综合精品五月天 | 亚洲欧美日韩精品久久亚洲区色播 | 成人手机在线 | 久久视频在线播放视频99re6 | 亚洲国产精品成人午夜在线观看 | 欧美日韩一区二区视频图片 | av中文字幕网免费观看 | 国产欧美日韩精品第一区 | 国产精品日本欧美一区二区 | 全部免费毛片免费播放 | 国产aⅴ精品一区二区三区久久 | 在线免费观看欧美 | 中文字幕一区二区在线观看 | 美国成人免费视频 | 久久香蕉国产线看观看精品yw | 国产情侣自拍网站 | 色本道| 久青草免费视频手机在线观看 | 日韩欧美亚洲中字幕在线播放 | 久草资源网 | 99国产国人青青视频在线观看 | 久久国产视频一区 | 一级不卡毛片免费 | 亚洲欧美第一 | a黄毛片| 免费高清毛片在线播放视频 | 国产猛烈无遮掩视频免费网站男女 | 在线看免费观看韩国特黄一级 | 国产一线视频在线观看高清 | 色一伦一情一区二区三区 | 国产精品天天爽夜夜欢张柏芝 | 特黄大片aaaaa毛片 | 久久久久欧美精品网站 | 精品国产香蕉在线播出 | 日日摸日日碰夜夜爽久久 | 男女那个视频免费 | 国产三级在线看 | 久久狠狠色狠狠色综合 | 亚洲精品国产专区91在线 |