博客 / 詳情

返回

JAVA IO流簡介

1. IO流概述

IO,即in和out,也就是輸入和輸出,指應用程序和外部設備之間的數據傳遞,常見的外部設備包括文件、管道、網絡連接。

流(Stream),是一個抽象的概念,是指一連串的數據(字符或字節),是以先進先出的方式發送信息的通道。

關於流的特性有下面幾點:
1.先進先出:最先寫入輸出流的數據最先被輸入流讀取到。
2.順序存取:可以一個接一個地往流中寫入一串字節,讀出時也將按寫入順序讀取一串字節,不能隨機訪問中間的數據。(RandomAccessFile除外)
3.只讀或只寫:每個流只能是輸入流或輸出流的一種,不能同時具備兩個功能,輸入流只能進行讀操作,對輸出流只能進行寫操作。在一個數據傳輸通道中,如果既要寫入數據,又要讀取數據,則要分別提供兩個流。

  • IO流的分類

    • 按照數據的流向

      • 輸入流:讀數據
      • 輸出流:寫數據
    • 按照數據類型來分

      • 字節流

        • 字節輸入流
        • 字節輸出流
      • 字符流

        • 字符輸入流
        • 字符輸出流
  • IO流的使用場景

    • 如果操作的是純文本文件,優先使用字符流
    • 如果操作的是圖片、視頻、音頻等二進制文件。優先使用字節流
    • 如果不確定文件類型,優先使用字節流。字節流是萬能的流

2. File類

File類介紹

  • 它是文件和目錄路徑名的抽象表示
  • 文件和目錄是可以通過File封裝成對象
  • 對於File而言,其封裝的並不是一個真正存在的文件,僅僅是一個路徑名而已。它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個路徑的內容轉換為具體存在的

構造方法

方法名 | 説明

  • File(String pathname) 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例
    File(String parent, String child) 從父路徑名字符串和子路徑名字符串創建新的 File實例
    File(File parent, String child) 從父抽象路徑名和子路徑名字符串創建新的 File實例

File創建與刪除功能

方法名 | 説明

  • public boolean createNewFile() 當具有該名稱的文件不存在時,創建一個由該抽象路徑名命名的新空文件。—— 父路徑必須存在,否則會報“系統找不到指定的路徑”
    public boolean mkdir() 創建由此抽象路徑名命名的目錄
    public boolean mkdirs() 創建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄
    public boolean delete() 刪除此File表示的文件或目錄(只能刪除空目錄)

3. 字節流

  • 字節流抽象基類

    • InputStream:這個抽象類是表示字節輸入流的所有類的超類
    • OutputStream:這個抽象類是表示字節輸出流的所有類的超類
    • 子類名特點:子類名稱都是以其父類名作為子類名的後綴

字節輸出流

  • 父類:OutputStream(抽象類)
  • 子類:FileOutputStream;文件輸出流用於將數據寫入文件

使用字節輸入流寫數據的步驟

1、創建字節輸出流對象(調用系統功能創建了文件,創建字節輸出流對象,讓字節輸出流對象指向文件):FileOutputStream(String name) ,(name表示文件路徑)
2、調用字節輸出流對象的寫數據方法:void write(int b)
3、釋放資源(關閉此文件輸出流並釋放與此流相關聯的任何系統資源):void close()

寫入數據的三種方式
方法名 | 説明

  • void write(int b) 將指定的字節寫入此文件輸出流一次寫一個字節數據
    void write(byte[ ] b) 將b.length字節從指定的字節數組寫入此文件輸出流一次寫一個字節數組數據
    void wirte(byte[ ] b,int off,int len) 將len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流一次寫一個字節數組的部分數據

字節流寫數據加異常處理

  • finally:在異常處理時提供finally塊來執行所有清除操作。比如説O流中的釋放資源
  • 特點:被finally控制的語句一定會執行,除非JVM退出

字節輸入流

  • 父類:InputStream(抽象類)
  • 子類:FileInputStream(實現類:從文件系統中的文件獲取輸入字節)

構造方法

方法名 説明
public FileInputStream(File path) 創建一個字節輸入流管道與源文件對象接通
public FileInputStream(String pathName) 創建一個字節輸入流管道與文件路徑對接

讀取方法

方法名 説明
public int read() 每次讀取一個字節返回!讀取完畢會返回 -1
public int read(byte[] buffer) 從字節輸入流中讀取字節到字節數組中去,返回讀取的字節數量,沒有字節可讀返回 -1
  • 使用字節輸入流讀數據的步驟

    • 1、創建字節輸入流對象
    • 2、調用字節輸入流對象的讀數據方法
    • 3、釋放資源

字節緩衝流

BufferedInputStream:創建BufferedInputStream將創建一個內部緩衝區數組。 當從流中讀取或跳過字節時,內部緩衝區將根據需要從所包含的輸入流中重新填充,一次填充字節

BufferedOutputStream:該類實現緩衝輸出流。通過設置這樣的輸出流, 應用程序可以向底層輸出流寫入字節。

構造方法

方法名 説明
BufferedOutputStream(OutputStream out) 創建字節緩衝輸出流對象
BufferedInputStream(InputStream in) 創建字節緩衝輸入流對象

4. 字符流

  • 字符流抽象基類

    • Reader:字符輸入流的抽象類
    • Writer:字符輸出流的抽象類

字符流概述

由於字節流操作中文不是特別的方便,所以Java就提供字符流

字符流 = 字節流 + 編碼表

漢字在存儲的時候,無論選擇哪種編碼存儲,第一個字節都是負數

編碼規則:

128個US-ASCII字符,只需一個字節編碼

拉丁文等字符,需要二個字節編碼

大部分常用字(含中文),使用三個字節編碼

其他極少使用的Unicode輔助字符,使用四字節編碼

字符串中的編碼解碼問題

方法名 説明
byte[] getBytes() 使用平台的默認字符集將該 String編碼為一系列字節
byte[] getBytes(String charsetName) 使用指定的字符集將該 String編碼為一系列字節
String(byte[] bytes) 使用平台的默認字符集解碼指定的字節數組來創建字符串
String(byte[] bytes, String charsetName) 通過指定的字符集解碼指定的字節數組來創建字符

字符流中的編碼解碼問題

  • InputStreamReader:是從字節流到字符流的橋樑

    它讀取字節,並使用指定的編碼將其解碼為字符

    它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平台的默認字符集

  • OutputStreamWriter:是從字符流到字節流的橋樑

    是從字符流到字節流的橋樑,使用指定的編碼將寫入的字符編碼為字節

    它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平台的默認字符集

構造方法

方法名 | 説明

  • InputStreamReader(InputStream in) 使用默認字符編碼創建InputStreamReader對象
    InputStreamReader(InputStream in,String chatset) 使用指定的字符編碼創建InputStreamReader對象
    OutputStreamWriter(OutputStream out) 使用默認字符編碼創建OutputStreamWriter對象
    OutputStreamWriter(OutputStream out,String charset) 使用指定的字符編碼創建OutputStreamWriter對象

字符輸出流

方法名 | 説明

  • void write(int c) 寫一個字符
    void write(char[] cbuf) 寫入一個字符數組
    void write(char[] cbuf, int off, int len) 寫入字符數組的一部分
    void write(String str) 寫一個字符串
    void write(String str, int off, int len) 寫一個字符串的一部分

    關閉和刷新的方法

方法名 説明
flush() 刷新流,之後還可以繼續寫數據
close() 關閉流,釋放資源,但是在關閉之前會先刷新流。一旦關閉,就不能再寫數據

字符緩衝流

BufferedReader:從字符輸入流讀取文本,緩衝字符,以提供字符,數組和行的高效讀取,可以指定緩衝區大小,或者可以使用默認大小。默認值足夠大,可用於大多數用途

BufferedWriter:將文本寫入字符輸出流,緩衝字符,以提供單個字符,數組和字符串的高效寫入,可以指定緩衝區大小,或者可以接受默認大小。默認值足夠大,可用於大多數用途

構造方法

方法名 説明
BufferedWriter(Writer out) 創建字符緩衝輸出流對象
BufferedReader(Reader in) 創建字符緩衝輸入流對象

字符緩衝流特有功能

BufferedWriter:

方法名 説明
void newLine() 寫一行行分隔符,行分隔符字符串由系統屬性定義

字符緩衝流特有功能

BufferedWriter:

方法名 説明
void newLine() 寫一行行分隔符,行分隔符字符串由系統屬性定義

5. IO流小結

image.png

6. 特殊流

標準輸入輸出流

標準輸入流

System類中有兩個靜態的成員變量:
public static final InputStream in:標準輸入流,通常該流對應於鍵盤輸入或由主機環境或用户指定的另一個輸入源
public static final PrintStream out:標準輸出流,通常該流對應於顯示輸出或由主機環境或用户指定的另一個輸入源

標準輸出流

  • 輸出語句的本質:是一個標準的輸出流

    • PrintStream ps = System.out;
    • PrintStream類有的方法,System.out都可以使用

打印流

  • 打印流分類:

    • 字節打印流:PrintStream
  • 字符打印流:PrintWriter
  • 打印流特點:

    • 只負責輸出數據,不負責讀取數據
    • 有自己特有方法

對象操作流

對象序列化:就是將對象保存到磁盤中,或者在網絡中傳輸對象

這種機制就是使用一個字節序列表示個對象,該字節序列包含:對象的類型、對象的數據和對象中存儲的屬性等信息字節序列寫到文件之後,相當於文件中持久保存了一個對象的信息

反之,該字節序列還可以從文件中讀取回來,重構對象,對它進行反序列化

  • 要實現序列化和反序列化就要使用對象序列化流和對象反序列化流:

    • 對象序列化流: ObjectOutputStream
    • 對象反序列化流:ObjectInputStream
user avatar an_653b347d1d3da 頭像 codingdgsun 頭像 fulng 頭像 mokeywie 頭像 yadong_zhang 頭像 huzilachadedanche 頭像 deltaf 頭像 goudantiezhuerzi 頭像 buxiyan 頭像 saoming_zhang 頭像 async_wait 頭像 longbig 頭像
15 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.