Java IO流處理 面試題匯總


 

說明:本節內容來源於網絡匯總

這里寫圖片描述

這里寫圖片描述

輸入輸出流是相對於內存而言的!

1、面試題匯總

(1)java中有幾種類型的流?

字符流和字節流。字節流繼承inputStream和OutputStream,字符流繼承自InputSteamReader和OutputStreamWriter。

 

(2)談談Java IO里面的常見類,字節流,字符流、接口、實現類、方法阻塞

答:輸入流就是從外部文件輸入到內存,輸出流主要是從內存輸出到文件。 

IO里面常見的類,第一印象就只知道IO流中有很多類,IO流主要分為字符流和字節流。字符流中有抽象類InputStream和OutputStream,它們的子類FileInputStream,FileOutputStream,BufferedOutputStream等。字符流BufferedReader和Writer等。都實現了Closeable, Flushable, Appendable這些接口。程序中的輸入輸出都是以流的形式保存的,流中保存的實際上全都是字節文件。 

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

 

(3)字符流和字節流有什么區別?

要把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream ,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。

(字符流處理的單元為 2 個字節的 Unicode 字符,分別操作字符、字符數組或字符串;而字節流處理單元為 1 個字節,操作字節和字節數組。所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的,如果是音頻文件、圖片、歌曲,就用字節流好點(避免數據丟失);如果是關系到中文(文本)的,用字符流好點)

 

在應用中,經常要完全是字符的一段文本輸出去或讀進來,用字節流可以嗎? 

計算機中的一切最終都是二進制的字節形式存在。對於“中國”這些字符,首先要得到其對應的字節,然后將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,人家專門提供了字符流的包裝類。

 

底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設別寫入或讀取字符串提供了一點點方便。

 

(4)講講NIO

答:看了一些文章,傳統的IO流是阻塞式的,會一直監聽一個ServerSocket,在調用read等方法時,他會一直等到數據到來或者緩沖區已滿時才返回。調用accept也是一直阻塞到有客戶端連接才會返回。每個客戶端連接過來后,服務端都會啟動一個線程去處理該客戶端的請求。並且多線程處理多個連接。每個線程擁有自己的棧空間並且占用一些 CPU 時間。每個線程遇到外部未准備好的時候,都會阻塞掉。阻塞的結果就是會帶來大量的進程上下文切換。 

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

1.Buffer為所有的原始類型提供 (Buffer)緩存支持。 

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

3.Channel一個新的原始 I/O抽象,用於讀寫Buffer類型,通道可以認為是一種連接,可以是到特定設備,程序或者是網絡的連接。

(5)遞歸讀取文件夾的文件

 1 package test;
 2 
 3 import java.io.File;
 4 
 5 /**
 6  * 
 7  * 遞歸讀取文件夾的文件
 8  */
 9 public class ListFileDemo {
10     public static void listFile(String path) {
11         if (path == null) {
12             return;// 因為下面的new File如果path為空,回報異常
13         }
14         File[] files = new File(path).listFiles();
15         if (files == null) {
16             return;
17         }
18         for(File file : files) {
19             if (file.isFile()) {
20                 System.out.println(file.getName());
21             } else if (file.isDirectory()) {
22                 System.out.println("Directory:"+file.getName());
23                 listFile(file.getPath());
24             } else {
25                 System.out.println("Error");
26             }
27         }
28     }
29 
30     public static void main(String[] args) {
31         ListFileDemo.listFile("D:\\data");
32 
33     }
34 }

 

2、Java IO總結

(1)明確源和目的。

數據source:就是需要讀取,可以使用兩個體系:InputStream、Reader;
數據destination:就是需要寫入,可以使用兩個體系:OutputStream、Writer;

(2)操作的數據是否是純文本數據?

    如果是:
           數據source:Reader
           數據destination:Writer 
   如果不是:
           數據source:InputStream
           數據destination:OutputStream

(3)Java IO體系中有太多的對象,到底用哪個呢?

明確操作的數據設備。
數據source對應的設備:硬盤(File),內存(數組),鍵盤(System.in)
數據destination對應的設備:硬盤(File),內存(數組),控制台(System.out)。

記住,只要一讀取鍵盤錄入,就用這句話。

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

 

原文:https://blog.csdn.net/chengyuqiang/article/details/79183748


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM