一步步帶你剖析Java中的Reader類

来源:https://www.cnblogs.com/huaweiyun/archive/2023/10/27/17792217.html
-Advertisement-
Play Games

本文分享自華為雲社區《深入理解Java中的Reader類:一步步剖析》,作者:bug菌。 前言 在Java開發過程中,我們經常需要讀取文件中的數據,而數據的讀取需要一個合適的類進行處理。Java的IO包提供了許多類用於數據的讀取和寫入,其中Reader便是其中之一。本文將對Java中的Reader進 ...


本文分享自華為雲社區《深入理解Java中的Reader類:一步步剖析》,作者:bug菌。

前言

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

摘要

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

  1. Reader類的概述
  2. Reader類代碼的解析
  3. Reader類的應用場景案例
  4. Reader類的優缺點分析
  5. Reader類的方法介紹及源代碼分析
  6. Reader類的測試用例
  7. 全文小結和總結
  8. 附源碼
  9. 建議

本文通過對Java中的Reader進行詳細講解,旨在幫助開發者更好地掌握Reader的使用方法。

Reader類

概述

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

源代碼解析

Reader類是一個抽象類,它的源代碼定義如下:

public abstract class Reader implements Readable, Closeable {
    ...
}

其中,Reader實現了兩個介面:ReadableCloseableReadable介面中只定義了一個方法:

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 類的子類,可以方便地讀取各種類型的字元流數據。如果你還有更多貼切生活或工作中的案例,歡迎評論區交流呀,獨樂樂不如眾樂樂。

利弊分析

優點

  1. Reader類支持字元流的讀取,可以準確地讀取文本文件中的數據。
  2. Reader類能夠自動處理字元編碼問題,在讀取文件時能夠自動轉換編碼方式。
  3. 可以通過Reader類的各個子類實現不同的功能,使用靈活。

缺點

  1. Reader類讀取數據的速度較慢,不適合讀取二進位數據。
  2. Reader類不能隨機訪問文件中的數據,只能逐行讀取,讀取大文件時效率較低。
  3. 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」,提供給同學們一對一參考學習,輔助你更迅速的掌握。

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 近期對管理後臺相關功能進行優化,其中導出功能涉及到查詢數據過多導致查詢很慢問題,決定採用點擊後加入到下載中心方式,既解決了介面慢等待問題,也方便後期各種文件的重覆下載,一舉多得~ 功能上很好實現,調介面就可以了,主要涉及到一個小球飛入效果 ...
  • 一、數組的存儲 1、當聲明一個變數時,var a = 111; 在後臺電腦翻譯時,var聲明 a變數 所以此時會產生一個棧記憶體,變數 a 的初始值為undefined,然後 = 111 ; undefined消失,111的值被賦值給了a。如果多個變數賦值的話,棧記憶體的執行順序是先進後出的順序。也叫 ...
  • 引言 近期,三大主流瀏覽器引擎均發佈最新版本,支持W3C的CSS Color 4標準,包含新的取色方法color()和相應語法,可展示更多的色域及色彩空間,這意味著web端能展示更豐富更高清的色彩。雖然目前只有最新版本的現代瀏覽器才支持,我們可以先提前瞭解一下這項新標準。 本文首先會先簡單介紹幾個色 ...
  • 非功能性需求是什麼呢?保障系統持續健康運轉的輔助需求。依然以電商系統的優惠券為例,在促銷活動期間發放大量優惠券,如何防止用戶集中領券時系統不崩盤呢?活動結束後,如何收縮伺服器,節省伺服器資源呢? 非功能性需求是面向運維的,重要但是不太緊迫,有時候可以沒有操作界面,由架構師提出解決方案,再推動各個業務... ...
  • 單詞 "多態" 意味著 "多種形式",在編程中,它指的是具有相同名稱的方法/函數/操作符,可以在許多不同的對象或類上執行。 函數多態性 一個示例是 Python 中的 len() 函數,它可以用於不同的對象。 字元串 對於字元串,len() 返回字元的數量: 示例 x = "Hello World! ...
  • PDF(Portable Document Format)是一種常用的文檔格式,具有跨平臺相容性、保真性、安全性和交互性等特點。我們日常生活工作中的合同、報告、論文等通常都採用PDF格式,以確保文檔在不同的操作系統(例如 Windows、Mac、Linux)和設備上被查看時都能保持外觀的一致性。 P ...
  • 本章節主要講的是如何配置熱載入,會碰到什麼問題,要怎麼處理。`wmproxy`是由`Rust`編寫,已實現`http/https`代理,`socks5`代理, 反向代理,靜態文件伺服器,內網穿透,配置熱更新等, ...
  • 字元串中的BKDRHash哈希函數 在電腦科學中,哈希函數是一種將任意長度的輸入(也稱為“消息”)通過散列演算法轉換成固定長度的輸出,該輸出就是哈希值。哈希函數的一個重要特性是,對於相同的輸入,無論何時執行哈希函數,它都應該產生相同的輸出。然而,對於不同的輸入,即使它們只有微小的差別,哈希函數也應該 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...