本文分享自華為云社區(qū)《深入理解Java中的Reader類:一步步剖析》,作者:bug菌。
前言
在Java開發(fā)過程中,我們經(jīng)常需要讀取文件中的數(shù)據(jù),而數(shù)據(jù)的讀取需要一個合適的類進行處理。Java的IO包提供了許多類用于數(shù)據(jù)的讀取和寫入,其中Reader便是其中之一。本文將對Java中的Reader進行詳細介紹,并分析其優(yōu)缺點及應(yīng)用場景。
摘要
本文將從以下幾個方面對Java中的Reader
類進行詳細介紹:
- Reader類的概述
- Reader類代碼的解析
- Reader類的應(yīng)用場景案例
- Reader類的優(yōu)缺點分析
- Reader類的方法介紹及源代碼分析
- Reader類的測試用例
- 全文小結(jié)和總結(jié)
- 附源碼
- 建議
本文通過對Java中的Reader進行詳細講解,旨在幫助開發(fā)者更好地掌握Reader的使用方法。
Reader類
概述
Reader類是Java中用于讀取字符流的抽象類。它是所有字符輸入流的超類,提供了字符輸入流讀取時的基本功能。Reader類主要由三個類實現(xiàn),分別是InputStreamReader、FileReader和CharArrayReader。
源代碼解析
Reader
類是一個抽象類,它的源代碼定義如下:
public abstract class Reader implements Readable, Closeable { ... }
其中,Reader實現(xiàn)了兩個接口:Readable
和Closeable
。Readable
接口中只定義了一個方法:
public interface Readable { int read(CharBuffer cb) throws IOException; }
而Closeable
接口中也只定義了一個方法:
public interface Closeable extends AutoCloseable { void close() throws IOException; }
這兩個接口的作用分別是提供讀取字符和關(guān)閉資源的方法。
應(yīng)用場景案例
Reader類通常用于讀取文本文件中的數(shù)據(jù)。比如我們經(jīng)常使用的BufferedReader就是Reader類的一個子類,用于逐行讀取文本文件中的數(shù)據(jù)。除此之外,Reader還可用于讀取網(wǎng)絡(luò)數(shù)據(jù)、讀取控制臺輸入等場景。
下面是幾個 使用Reader 類的應(yīng)用場景案例,同學們僅供參考:
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(); } }
通過上述案例,我們本地演示,結(jié)果可見如下:
2. 讀取網(wǎng)絡(luò)資源
可以使用 InputStreamReader 和 URL 類來讀取網(wǎng)絡(luò)資源,例如:
//2. 讀取網(wǎng)絡(luò)資源 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(); }
通過上述案例,我們本地演示,結(jié)果可見如下:
3. 讀取字符串
可以使用 StringReader 類來將一個字符串轉(zhuǎn)換為字符流,例如:
//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(); }
通過上述案例,我們本地演示,結(jié)果可見如下:
通過介紹及演示以上三個比較常見的 Java 中運用 Reader 類的應(yīng)用場景案例,通過使用 Reader 類的子類,可以方便地讀取各種類型的字符流數(shù)據(jù)。如果你還有更多貼切生活或工作中的案例,歡迎評論區(qū)交流呀,獨樂樂不如眾樂樂。
利弊分析
優(yōu)點
-
Reader
類支持字符流的讀取,可以準確地讀取文本文件中的數(shù)據(jù)。 -
Reader
類能夠自動處理字符編碼問題,在讀取文件時能夠自動轉(zhuǎn)換編碼方式。 - 可以通過
Reader
類的各個子類實現(xiàn)不同的功能,使用靈活。
缺點
-
Reader
類讀取數(shù)據(jù)的速度較慢,不適合讀取二進制數(shù)據(jù)。 -
Reader
類不能隨機訪問文件中的數(shù)據(jù),只能逐行讀取,讀取大文件時效率較低。 -
Reader
類的使用較為繁瑣,需要通過緩沖區(qū)等方式來提高讀取速度和效率。
類代碼方法介紹
構(gòu)造方法
protected Reader()
Reader類的默認構(gòu)造方法。
方法
public int read() throws IOException
用處:讀取單個字符,并返回該字符的ASCII碼,如果到達流的末尾,返回-1。
public int read(char[] cbuf) throws IOException
用處:讀取字符數(shù)組,返回讀取的字符個數(shù)。
public int read(char[] cbuf, int offset, int length) throws IOException
用處:讀取指定長度的字符數(shù)組,返回讀取的字符個數(shù)。
public long skip(long n) throws IOException
用處:跳過n個字符(包括空格),返回實際跳過的字符數(shù)。
public boolean ready() throws IOException
用處:判斷是否可以從流中讀取字符,如果可以讀取返回true。
public boolean markSupported()
用處:判斷此流是否支持mark()操作。如果支持,則返回true,否則返回false。
public void mark(int readAheadLimit) throws IOException
用處:設(shè)置mark位置,并將輸入流中的指針指向mark位置。如果該流不支持mark()操作,則拋出IOException異常。
public void reset() throws IOException
用處:將輸入流中的指針重新指向mark位置。如果該流不支持reset()操作,則拋出IOException異常。
abstract public void close() throws IOException
用處:關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。
測試用例
以下是一個使用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(); } }
測試結(jié)果展示
根據(jù)如上測試用例,我們來執(zhí)行下main主函數(shù)進行測試讀取文件的字符數(shù)據(jù),結(jié)果展示如下截圖:
通過控制臺輸出的內(nèi)容與原文本內(nèi)容進行對比,可得該測試用例運用Reader類正常讀取文件內(nèi)容,
代碼解析
如上測試代碼使用了Reader 類從文件中讀取字符數(shù)據(jù)。如下來對該代碼進行步驟解析,以幫助同學們加速理解。
首先,我們先創(chuàng)建一個 File 對象,指定要讀取的文件路徑,然后使用?FileReader
?類將該文件讀取到內(nèi)存中,并返回?Reader
?對象。然后使用?char[]
?數(shù)組作為緩沖區(qū),將數(shù)據(jù)從?Reader
?中讀取到緩沖區(qū),并使用?String
?類將緩沖區(qū)數(shù)據(jù)轉(zhuǎn)化為字符串輸出到控制臺,直到所有數(shù)據(jù)都被讀取完畢。最后,關(guān)閉 Reader 對象釋放相關(guān)資源。整個讀取過程非常簡單,你們學會了嗎?
全文小結(jié)
本文對Java中的Reader
類進行了詳細介紹,包括其簡介、源代碼解析、應(yīng)用場景案例、優(yōu)缺點分析、方法介紹及測試用例。通過本文的學習,我們可以更好地掌握Reader
的使用方法,并在開發(fā)中合理使用Reader
類。
總結(jié)
Reader
類是Java中一個用于讀取字符流的抽象類,它具有讀取文本數(shù)據(jù)、自動處理字符編碼等優(yōu)點,并可通過其子類實現(xiàn)不同的功能。但是,Reader類讀取數(shù)據(jù)的速度較慢,不適合讀取二進制數(shù)據(jù),而且不能隨機訪問文件中的數(shù)據(jù)。在使用Reader
類時,要注意使用緩沖區(qū)等方式來提高讀取速度和效率。最后,要注意關(guān)閉資源,避免資源泄漏問題的發(fā)生。
附錄源碼
如上涉及所有源碼均已上傳同步在「Gitee」,提供給同學們一對一參考學習,輔助你更迅速的掌握。
點擊關(guān)注,第一時間了解華為云新鮮技術(shù)~文章來源:http://www.zghlxwxcb.cn/news/detail-711328.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-711328.html
到了這里,關(guān)于一步步帶你剖析Java中的Reader類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!