資料的讀取和寫入,其中Reader便是其中之一

vbcjnmkk發表於2024-08-31

在Java開發過程中,我們經常需要讀取檔案中的資料,而資料的讀取需要一個合適的類進行處理。Java的IO包提供了許多類用於資料的讀取和寫入,其中Reader便是其中之一。本文將對Java中的Reader進行詳細介紹,並分析其優缺點及應用場景。

摘要
本文將從以下幾個方面對Java中的Reader類進行詳細介紹:

Reader類的概述
Reader類程式碼的解析
Reader類的應用場景案例
Reader類的優缺點分析
Reader類的方法介紹及原始碼分析
Reader類的測試用例
全文小結和總結
附原始碼
建議
本文透過對Java中的Reader進行詳細講解,旨在幫助開發者更好地掌握Reader的使用方法。

Reader類
概述
Reader類是Java中用於讀取字元流的抽象類。它是所有字元輸入流的超類,提供了字元輸入流讀取時的基本功能。Reader類主要由三個類實現,分別是InputStreamReader、FileReader和CharArrayReader。

原始碼解析
Reader類是一個抽象類,它的原始碼定義如下:

public abstract class Reader implements Readable, Closeable {
...
}
其中,Reader實現了兩個介面:Readable和Closeable。Readable介面中只定義了一個方法:

public interface Readable {
int read(CharBuffer cb) throws IOException;
}
而Closeable介面中也只定義了一個方法:

public interface Closeable extends AutoCloseable {
void close() throws IOException;
}
這兩個介面的作用分別是提供讀取字元和關閉資源的方法。

應用場景案例
Reader類通常用於讀取文字檔案中的資料。比如我們經常使用的BufferedReader就是Reader類的一個子類,用於逐行讀取文字檔案中的資料。除此之外,Reader還可用於讀取網路資料、讀取控制檯輸入等場景。

下面是幾個 使用Reader 類的應用場景案例,同學們僅供參考:

  1. 讀取文字檔案
    使用 FileReader 類來讀取文字檔案很常見。例如可以使用 FileReader 和 BufferedReader 組合來讀取一個文字檔案並逐行輸出:

複製程式碼
//1. 讀取文字檔案
public static void testReadFile(){
FileReader fileReader;
BufferedReader bufferedReader;
try {
fileReader = new FileReader("./template/fileTest.txt");
bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
複製程式碼
透過上述案例,我們本地演示,結果可見如下:

  1. 讀取網路資源
    可以使用 InputStreamReader 和 URL 類來讀取網路資源,例如:

複製程式碼
//2. 讀取網路資源
public static void testReadURL() throws IOException {
URL url = new URL("https://www.baidu.com/");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

    br.close();
    isr.close();
    is.close();
}

public static void main(String[] args) throws IOException {
    testReadURL();
}

複製程式碼
透過上述案例,我們本地演示,結果可見如下:

  1. 讀取字串
    可以使用 StringReader 類來將一個字串轉換為字元流,例如:

複製程式碼

//3. 讀取字串

//程式碼效果參考:https://www.h3cw.com/sitemap/post.xml
public static void testReadStr() throws IOException {
String str = "Hello, World!!!";
StringReader stringReader = new StringReader(str);
int data;
while ((data = stringReader.read()) != -1) {
System.out.print((char) data);
}
stringReader.close();
}

public static void main(String[] args) throws IOException {
    testReadStr();
}

複製程式碼
透過上述案例,我們本地演示,結果可見如下:

透過介紹及演示以上三個比較常見的 Java 中運用 Reader 類的應用場景案例,透過使用 Reader 類的子類,可以方便地讀取各種型別的字元流資料。如果你還有更多貼切生活或工作中的案例,歡迎評論區交流呀,獨樂樂不如眾樂樂。

利弊分析
優點
Reader類支援字元流的讀取,可以準確地讀取文字檔案中的資料。
Reader類能夠自動處理字元編碼問題,在讀取檔案時能夠自動轉換編碼方式。
可以透過Reader類的各個子類實現不同的功能,使用靈活。
缺點
Reader類讀取資料的速度較慢,不適合讀取二進位制資料。
Reader類不能隨機訪問檔案中的資料,只能逐行讀取,讀取大檔案時效率較低。
Reader類的使用較為繁瑣,需要透過緩衝區等方式來提高讀取速度和效率。
類程式碼方法介紹
構造方法
protected Reader()
Reader類的預設構造方法。

方法
public int read() throws IOException
用處:讀取單個字元,並返回該字元的ASCII碼,如果到達流的末尾,返回-1。

public int read(char[] cbuf) throws IOException
用處:讀取字元陣列,返回讀取的字元個數。

public int read(char[] cbuf, int offset, int length) throws IOException
用處:讀取指定長度的字元陣列,返回讀取的字元個數。

public long skip(long n) throws IOException
用處:跳過n個字元(包括空格),返回實際跳過的字元數。

public boolean ready() throws IOException
用處:判斷是否可以從流中讀取字元,如果可以讀取返回true。

public boolean markSupported()
用處:判斷此流是否支援mark()操作。如果支援,則返回true,否則返回false。

public void mark(int readAheadLimit) throws IOException
用處:設定mark位置,並將輸入流中的指標指向mark位置。如果該流不支援mark()操作,則丟擲IOException異常。

public void reset() throws IOException
用處:將輸入流中的指標重新指向mark位置。如果該流不支援reset()操作,則丟擲IOException異常。

abstract public void close() throws IOException
用處:關閉該流並釋放與之關聯的所有資源。

測試用例
以下是一個使用Reader類讀取檔案的測試用例:

測試程式碼演示
複製程式碼
package com.example.javase.io.reader;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**

  • @author bug菌

  • @version 1.0

  • @date 2023/10/19 10:34
    */
    public class ReaderTest {

    public static void main(String[] args) throws IOException {
    File file = new File("./template/fileTest.txt");
    Reader reader = new FileReader(file);

     char[] buffer = new char[1024];
     int len;
     while ((len = reader.read(buffer)) != -1) {
         System.out.println(new String(buffer, 0, len));
     }
     reader.close();
    

    }
    }
    複製程式碼
    測試結果展示
    根據如上測試用例,我們來執行下main主函式進行測試讀取檔案的字元資料,結果展示如下截圖:

透過控制檯輸出的內容與原文字內容進行對比,可得該測試用例運用Reader類正常讀取檔案內容,

程式碼解析
如上測試程式碼使用了Reader 類從檔案中讀取字元資料。如下來對該程式碼進行步驟解析,以幫助同學們加速理解。

首先,我們先建立一個 File 物件,指定要讀取的檔案路徑,然後使用 FileReader 類將該檔案讀取到記憶體中,並返回 Reader 物件。然後使用 char[] 陣列作為緩衝區,將資料從 Reader 中讀取到緩衝區,並使用 String 類將緩衝區資料轉化為字串輸出到控制檯,直到所有資料都被讀取完畢。最後,關閉 Reader 物件釋放相關資源。整個讀取過程非常簡單,你們學會了嗎?

全文小結
本文對Java中的Reader類進行了詳細介紹,包括其簡介、原始碼解析、應用場景案例、優缺點分析、方法介紹及測試用例。透過本文的學習,我們可以更好地掌握Reader的使用方法,並在開發中合理使用Reader類。

總結
Reader類是Java中一個用於讀取字元流的抽象類,它具有讀取文字資料、自動處理字元編碼等優點,並可透過其子類實現不同的功能。但是,Reader類讀取資料的速度較慢,不適合讀取二進位制資料,而且不能隨機訪問檔案中的資料。在使用Reader類時,要注意使用緩衝區等方式來提高讀取速度和效率。最後,要注意關閉資源,避免資源洩漏問題的發生。

附錄原始碼
如上涉及所有原始碼均已上傳同步在「Gitee」,提供給同學們一對一參考學習,輔助你更迅速的掌握。

點選關注,第一時間瞭解華為雲新鮮技術~

分類: 程式設計師之家
標籤: java , Reader類 , 資料讀取
好文要頂 關注我 收藏該文 微信分享
華為雲開發者聯盟
粉絲 - 827 關注 - 1
+加關注
00
升級成為會員
« 上一篇: DWS臨時記憶體不可用報錯: memory temporarily unavailable
» 下一篇: 華為雲GaussDB城市沙龍活動走進安徽,助力金融行業數字化轉型
posted @ 2023-10-27 14:11 華為雲開發者聯盟 閱讀(408) 評論(0) 編輯 收藏 舉報
重新整理評論重新整理頁面返回頂部
發表評論 升級成為園子VIP會員
編輯
預覽
支援 Markdown

自動補全
退出 訂閱評論 我的部落格

[Ctrl+Enter快捷鍵提交]

【推薦】輕量又高效能的 SSH 工具 IShell:AI 加持,快人一步
【推薦】100%開源!大型工業跨平臺軟體C++原始碼提供,建模,組態!
【推薦】天翼雲2核4G雲伺服器加購同規格資料庫,3個月僅售21.7元
【推薦】2024阿里雲超值優品季,精心為您準備的上雲首選必備產品
【推薦】會員力量,點亮園子希望,期待您升級成為部落格園VIP會員

編輯推薦:
· [WPF]資料繫結時為何會出現 StringFormat 失效
· OpenTelemetry 實戰:從零實現應用指標監控
· 使用 asp.net core 8+vue3 實現高效音視訊通話
· [kernel] 帶著問題看原始碼 —— 指令碼是如何被 execve 呼叫的
· 兩個存在包名與類名均相同的Jar包,要在工程中同時使用怎麼辦?
閱讀排行:
· 程式設計師失業日記4:半個月拿下4個offer
· .NET 攝像頭採集
· 從程式碼到產品,我的IT職業成長之路
· 一個小小空格問題引起的bug
· 服務重啟了,如何保證執行緒池中的資料不丟失?

相關文章