本文分享自華為雲社區《深入理解Java中的Reader類:一步步剖析》,作者:bug菌。 前言 在Java開發過程中,我們經常需要讀取文件中的數據,而數據的讀取需要一個合適的類進行處理。Java的IO包提供了許多類用於數據的讀取和寫入,其中Reader便是其中之一。本文將對Java中的Reader進 ...
本文分享自華為雲社區《深入理解Java中的Reader類:一步步剖析》,作者:bug菌。
前言
在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(); } }
通過上述案例,我們本地演示,結果可見如下:
2. 讀取網路資源
可以使用 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(); }
通過上述案例,我們本地演示,結果可見如下:
3. 讀取字元串
可以使用 StringReader 類來將一個字元串轉換為字元流,例如:
//3. 讀取字元串 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」,提供給同學們一對一參考學習,輔助你更迅速的掌握。