您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java的IO流知識點有哪些”,在日常操作中,相信很多人在Java的IO流知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java的IO流知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
字節流和字符流:
字節流:以字節為單位,每次次讀入或讀出是8位數據。可以讀任何類型數據。
字符流:以字符為單位,每次次讀入或讀出是16位數據。其只能讀取字符類型數據。
輸出流和輸入流:
輸出流:從內存讀出到文件。只能進行寫操作。
輸入流:從文件讀入到內存。只能進行讀操作。
注意:這里的出和入,都是相對于系統內存而言的。
節點流和處理流:
節點流:直接與數據源相連,讀入或讀出。
處理流:與節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。
為什么要有處理流?直接使用節點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。
按操作方式分類結構圖:
根據以上分類,以及jdk的說明,我們可以畫出更詳細的類結構圖,如下:
分類說明
1. 輸入字節流InputStream:
輸入字節流的繼承圖可見上圖,可以看出:
FileInputStream: 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。
ByteArrayInputStream:
PipedInputStream: 是從與其它線程共用的管道中讀取數據。PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用于線程操作。
ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)
2. 輸出字節流OutputStream:
輸出字節流的繼承圖可見上圖,可以看出:
FIleOutputStream:是兩種基本的介質流
ByteArrayOutputStream: 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。
PipedOutputStream:是向與其它線程共用的管道中寫入數據。
ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。
字節流的輸入和輸出對照圖:
3. 字符輸入流Reader:
在上面的繼承關系圖中可以看出:
FileReader:
PipedReader:是從與其它線程共用的管道中讀取數據
CharArrayReader:
CharReader、StringReader 是兩種基本的介質流,它們分別將Char 數組、String中讀取數據。
BufferedReader 很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader 對象。
FilterReader 是所有自定義具體裝飾流的父類,其子類PushbackReader 對Reader 對象進行裝飾,會增加一個行號。
InputStreamReader: 是一個連接字節流和字符流的橋梁,它將字節流轉變為字符流。FileReader 可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream 轉變為Reader 的方法。我們可以從這個類中得到一定的技巧。Reader 中各個類的用途和使用方法基本和InputStream 中的類使用一致。后面會有Reader 與InputStream 的對應關系。
4. 字符輸出流Writer:
在上面的關系圖中可以看出:
FileWriter:
PipedWriter:是向與其它線程共用的管道中寫入數據
CharArrayWriter:
CharArrayWriter、StringWriter 是兩種基本的介質流,它們分別向Char 數組、String 中寫入數據。
BufferedWriter 是一個裝飾器,為Writer 提供緩沖功能。
PrintWriter 和PrintStream 極其類似,功能和使用也非常相似。
OutputStreamWriter: 是OutputStream 到Writer 轉換的橋梁,它的子類FileWriter 其實就是一個實現此功能的具體類(具體可以研究一SourceCode)。功能和使用和OutputStream 極其類似,后面會有它們的對應圖。
字符流的輸入和輸出對照圖:
5. 字符流與字節流轉換
轉換流的特點:
其是字符流和字節流之間的橋梁;
可對讀取到的字節數據經過指定編碼轉換成字符;
可對讀取到的字符數據經過指定編碼轉換成字節;
何時使用轉換流?
當字節和字符之間有轉換動作時;
流操作的數據需要編碼或解碼時。
具體的實現:
InputStreamReader:輸入流轉到讀流;
String fileName= "d:"+File.separator+"hello.txt"; File file=new File(fileName); Writer out=new OutputStreamWriter(new FileOutputStream(file)); out.write("hello"); out.close();
OutputStreamWriter:輸出流轉到寫流;
String fileName= "d:"+File.separator+"hello.txt"; File file=new File(fileName); Reader read=new InputStreamReader(new FileInputStream(file)); char[] b=new char[100]; int len=read.read(b); System.out.println(new String(b,0,len)); read.close();
這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。
按操作對象分類結構圖:
分類說明:
對文件進行操作(節點流):
FileInputStream(字節輸入流),
FileOutputStream(字節輸出流),
FileReader(字符輸入流),
FileWriter(字符輸出流)
對管道進行操作(節點流):
PipedInputStream(字節輸入流),
PipedOutStream(字節輸出流),
PipedReader(字符輸入流),
PipedWriter(字符輸出流)。
PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用于線程操作。
字節/字符數組流(節點流):
ByteArrayInputStream,
ByteArrayOutputStream,
CharArrayReader,
CharArrayWriter;
是在內存中開辟了一個字節或字符數組。
除了上述三種是節點流,其他都是處理流,需要跟節點流配合使用。
Buffered緩沖流(處理流):
BufferedInputStream,
BufferedOutputStream,
BufferedReader,
BufferedWriter,
是帶緩沖區的處理流,緩沖區的作用的主要目的是:避免每次和硬盤打交道,提高數據訪問的效率。
轉化流(處理流):
InputStreamReader:把字節轉化成字符;
OutputStreamWriter:把字節轉化成字符。
基本類型數據流(處理流):用于操作基本數據類型值。
DataInputStream,
DataOutputStream。
因為平時若是我們輸出一個8個字節的long類型或4個字節的float類型,那怎么辦呢?可以一個字節一個字節輸出,也可以把轉換成字符串輸出,但是這樣轉換費時間,若是直接輸出該多好啊,因此這個數據流就解決了我們輸出數據類型的困難。數據流可以直接輸出float類型或long類型,提高了數據讀寫的效率。
打印流(處理流):
PrintStream,
PrintWriter,
一般是打印到控制臺,可以進行控制打印的地方。
對象流(處理流):
ObjectInputStream,對象反序列化;
ObjectOutputStream,對象序列化;
把封裝的對象直接輸出,而不是一個個在轉換成字符串再輸出。
合并流(處理流):
SequenceInputStream:可以認為是一個工具類,將兩個或者多個輸入流當成一個輸入流依次讀取。
1. 復制文件:
/** * 復制文件:一邊讀,一邊寫 */ class hello { public static void main(String[] args) throws IOException { if (args.length != 2) { System.out.println("命令行參數輸入有誤,請檢查"); System.exit(1); } File file1 = new File(args[0]); File file2 = new File(args[1]); if (!file1.exists()) { System.out.println("被復制的文件不存在"); System.exit(1); } InputStream input = new FileInputStream(file1); OutputStream output = new FileOutputStream(file2); if ((input != null) && (output != null)) { int temp = 0; while ((temp = input.read()) != (-1)) { output.write(temp); } } input.close(); output.close(); } }
說明:
流在使用結束后,一定要執行關閉操作,即調用close( )方法。
FileInputStream.read():
這個方法是對這個流一個一個字節的讀,返回的結果就是這個字節的int表示方式;
當已經沒有內容時,返回的結果為-1;
FileOutputStream.write():
將內容寫到文件。
2. 不使用FIle,將流中的字符轉換大寫小:
public static void main(String[] args) throws IOException { String str = "ROLLENHOLT"; ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes()); ByteArrayOutputStream output = new ByteArrayOutputStream(); int temp = 0; while ((temp = input.read()) != -1) { char ch = (char) temp; output.write(Character.toLowerCase(ch)); } String outStr = output.toString(); input.close(); output.close(); System.out.println(outStr); }
說明:
流在使用結束后,一定要執行關閉操作,即調用close( )方法。
3. 使用管道流在多個線程間通信:
/** * 消息發送類 * */ class Send implements Runnable { private PipedOutputStream out = null; public Send() { out = new PipedOutputStream(); } public PipedOutputStream getOut() { return this.out; } public void run() { String message = "hello , Rollen"; try { out.write(message.getBytes()); } catch (Exception e) { e.printStackTrace(); } try { out.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 接受消息類 */ class Recive implements Runnable { private PipedInputStream input = null; public Recive() { this.input = new PipedInputStream(); } public PipedInputStream getInput() { return this.input; } public void run() { byte[] b = new byte[1000]; int len = 0; try { len = this.input.read(b); } catch (Exception e) { e.printStackTrace(); } try { input.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("接受的內容為 " + (new String(b, 0, len))); } } /** * 測試類 */ class hello { public static void main(String[] args) throws IOException { Send send = new Send(); Recive recive = new Recive(); try { //管道連接 send.getOut().connect(recive.getInput()); } catch (Exception e) { e.printStackTrace(); } new Thread(send).start(); new Thread(recive).start(); } }
4. 使用緩沖區從鍵盤上讀入內容:
public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); String str = null; System.out.println("請輸入內容"); try{ str = buf.readLine(); }catch(IOException e){ e.printStackTrace(); } System.out.println("你輸入的內容是:" + str); }
5. 將系統輸出定向到文件:
public static void main(String[] args) throws IOException { File file = new File("/Users/liuluming/Documents/hello.txt"); // 此刻直接輸出到屏幕 System.out.println("hello"); try { System.setOut(new PrintStream(new FileOutputStream(file))); } catch (FileNotFoundException e) { e.printStackTrace(); } System.out.println("這些內容在文件中才能看到哦!"); }
File類是對文件系統中文件以及文件夾進行封裝的對象,可以通過對象的思想來操作文件和文件夾。 File類保存文件或目錄的各種元數據信息,包括文件名、文件長度、最后修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、獲得當前目錄中的文件列表,創建、刪除文件和目錄等方法。
該對象并不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩沖區(字符數組),通過內部的指針來操作字符數組中的數據。 該對象特點:
該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。
該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)。
注意:
該對象在實例化時,如果要操作的文件不存在,會自動創建;如果文件存在,寫數據未指定位置,會從頭開始寫,即覆蓋原有的內容。 可以用于多線程下載或多個線程同時寫數據到文件
到此,關于“Java的IO流知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。