IO流
概念
I – in – 輸入(讀)
O – out – 輸出(寫)
流 – 一點一點的像水流一樣去傳輸數據
注意:站在程序的角度去看待輸入還是輸出
分類
按照方向分流:輸入流、輸出流
按照單位分流:字節流、字符流
按照功能分流:基礎流/節點流、處理流
注意:new 處理流(new 基礎流) – 裝飾者模型 – 處理流對象中往往包含了基礎流的對象,在基礎流的基礎上拓展了額外的功能,使得流更為強大(效率),工作中一般使用處理流
存儲單位
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
注意:進制1024
學習注意事項
- 按照流的發展歷史去學習
- 注意流與流之間的繼承關系
- 舉一反三
字節流
應用場景:操作二進制數據(音頻、視頻、圖片)
abstract class InputStream – 字節輸入流的基類(抽象類)
abstract class OutputStream – 字節輸出流的基類(抽象類)
class FileInputStream extends InputStream – 文件字節輸入流
class FileOutputStream extends OutputStream – 文件字節輸出流
class FilterInputStream extends InputStream – 過濾器字節輸入流
class FilterOutputStream extends OutputStream – 過濾器字節輸出流
class BufferedInputStream extends FilterInputStream – 帶緩沖區的字節輸入流
class BufferedOutputStream extends FilterOutputStream – 帶緩沖區的字節輸出流
默認緩沖區大小:8192字節 - new byte[8192]
字符流
應用場景:操作純文本數據
注意:字符流 = 字節流+編譯器
編譯器:可以識別中文字符和非中文字符,非中文字符獲取1個字節(一個字節=一個字符),編譯器會根據編碼格式獲取中文字符對應的字節數(GBK獲取兩個字節,UTF-8獲取三個字節)
abstract class Reader – 字符輸入流的基類(抽象類)
abstract class Writer – 字符輸出流的基類(抽象類)
class InputStreamReader extends Reader – 字符輸入轉換流
class OutputStreamWriter extends Writer – 字符輸出轉換流
特點:將字節流轉換為字符流,字符轉換流是字節流和字符流的橋梁
class FileReader extends InputStreamReader – 文件字符輸入流
class FileWriter extends OutputStreamWriter – 文件字符輸出流
class BufferedReader extends Reader – 帶緩沖區的字符輸入流
class BufferedWriter extends Writer – 帶緩沖區的字符輸出流
默認緩沖區:8192字符 – new char[8192]
各種流
對象流
class ObjectInputStream – 對象輸入流
class ObjectOutputStream – 對象輸出流
理解:
? 將程序中的對象寫入到文件
? 并且從文件中讀取出對象到程序里
序列化(鈍化):將程序里的對象寫入到文件
反序列化(活化):將文件里的對象讀取到程序中
注意:
- 如果對象想寫入文件,對象所屬的類就必須實現序列化接口(Serializable)
- Serializable序列化接口沒有任何的屬性和方法,這種接口稱之為標記型接口
- 對象所屬的類實現了序列化接口一定要添加序列化ID(serialVersionUID)
- 屬性使用transient修飾,該屬性不會隨著對象而寫入到文件中
內存流
class ByteArrayInputStream – 內存輸入流
class ByteArrayOutputStream – 內存輸出流
注意:
- 內存流是程序和內存交互,跟文件無關
- 內存流是程序到內存的通道,是關閉不掉的
應用場景:項目中頻繁使用的數據可以使用內存流備份一份
打印流
class PrintStream – 字節打印流
class PrintWriter – 字符打印流
注意:打印流實際上就是輸出流,只有一個方向(程序->文件)
PrintStream vs PrintWriter
區別1:PrintStream是以字節為單位,PrintWriter是以字符為單位
區別2:
? PrintStream:將字節流轉換為字節打印流
? PrintWriter:將字節流和字符流轉換為字符打印流
重定向
理解:重新定義系統標準的輸入流、輸出流、錯誤輸出流的方向
System.in:獲取系統標準輸入流的方向(控制臺->程序)
System.out:獲取系統標準輸出流的方向(程序->控制臺)
System.err:獲取系統標準錯誤輸出流的方向(程序->控制臺)//重定向:重新定義系統標準輸入流的方向(文件->程序)
System.setIn(new FileInputStream(“io.txt”));//重定向:重新定義系統標準輸出流的方向(程序->文件)
System.setOut(new PrintStream(new FileOutputStream(“io.txt”,true)));//重定向:重新定義系統標準錯誤輸出流的方向(程序->文件)
System.setErr(new PrintStream(new FileOutputStream(“io.txt”,true)));
隨機訪問流
class RandomAccessFile
理解:該流認為文件是一個大型的byte數組。有一個隱藏的指針(默認為0),其實就是下標,可以從指針的位置寫入或讀取,意味著該流兩個方向
模式:r-讀,rw-讀寫
提升作業:
流的大類:BIO、NIO、AIO
學習NIO和AIO,制作md文檔,其中包含概念、理解和代碼