1. 程式人生 > >Java開發崗位面試題歸類彙總二:Java IO

Java開發崗位面試題歸類彙總二:Java IO

1、講講IO裡面的常見類,位元組流,字元流、介面、實現類、方法阻塞

答:輸入流就是從外部檔案輸入到記憶體,輸出流主要是從記憶體輸出到檔案。我們用Eclipse開發小程式在控制檯輸入資料就屬於輸入流,即從控制檯輸入到記憶體。

IO裡面常見的類,第一印象就只知道IO流中有很多類,IO流主要分為字元流和位元組流。字元流中有抽象類InputStream和OutputStream,它們的子類FileInputStream,FileOutputStream,BufferedOutputStream等。字元流BufferedReader和Writer等。都實現了Closeable, Flushable, Appendable

這些介面。程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位元組檔案。

java中的阻塞式方法是指在程式呼叫改方法時,必須等待輸入資料可用或者檢測到輸入結束或者丟擲異常,否則程式會一直停留在該語句上,不會執行下面的語句。比如read()和readLine()方法。

這個是很多的例子:http://www.cnblogs.com/ShawnWithSmallEyes/p/3390740.html

2、講講NIO

答:看了一些文章,傳統的IO流是阻塞式的,會一直監聽一個ServerSocket,在呼叫read等方法時,他會一直等到資料到來或者緩衝區已滿時才返回。呼叫accept也是一直阻塞到有客戶端連線才會返回。每個客戶端連線過來後,服務端都會啟動一個執行緒去處理該客戶端的請求。並且多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且佔用一些

CPU 時間。每個執行緒遇到外部未準備好的時候,都會阻塞掉。阻塞的結果就是會帶來大量的程序上下文切換。

對於NIO,它是非阻塞式,核心類:

1.Buffer為所有的原始型別提供 (Buffer)快取支援。

2.Charset字符集編碼解碼解決方案

3.Channel一個新的原始 I/O抽象,用於讀寫Buffer型別,通道可以認為是一種連線,可以是到特定裝置,程式或者是網路的連線。

這個大家時JDk1.7的新特性,可以看視訊仔細研究

參考:http://www.open-open.com/lib/view/open1420790598093.html

3、String編碼UTF-8和GBK的區別

答:UTF-8是國際通用的編碼,通用性比較好,GBK是國家編碼,支援中文,但是相比UTF-8的通用性差,不過UTF-8佔用的資料庫比較大,所以相對反應速度要慢。

4、什麼時候使用位元組流,什麼時候    使用字元流

答:所有的輸入都是轉換成位元組流之後,然後在記憶體中變成字元流。所以一般建議使用字元流。但是遇到中文漢字,出現亂碼的情況下,可以使用位元組流。

在所有的硬碟上儲存檔案或進行傳輸的時候都是以位元組的方法進行的,包括圖片也是按位元組完成,而字元是隻有在記憶體中才會形成的,所以使用位元組的操作是最多的。我們建議儘量嘗試使用字元流,一旦程式無法成功編譯,就不得不使用面向位元組的類庫,即位元組流。

5、遞迴讀取資料夾的檔案,程式碼怎麼實現

答:利用File中的listFiles方法,將所有檔案儲存訪問,然後遞迴呼叫。程式碼如下:

publicclass Test {

  publicvoidvisitFile(String path){

     if(path==null){

       return;//因為下面的new File如果path為空,回報異常

     }

     File[] files=new File(path).listFiles();

     if(files==null){

       return;

     }

     for(Filefile:files){

       if(file.isFile()){

         System.out.println(file.getName());

       }elseif(file.isDirectory()){

         System.out.println("Directory");

         visitFile(file.getPath());

       }else{

         System.out.println("Error");

       }

     }

  }

  publicstatic voidmain(String[]args) {

     Test dc = new Test();

     dc.visitFile("F:/檔案");

  }

}