說明:本節內容來源於網絡匯總
輸入輸出流是相對於內存而言的!
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