java IO(五):位元組流、字元流的選擇規律

来源:https://www.cnblogs.com/f-ck-need-u/archive/2017/12/31/8159282.html
-Advertisement-
Play Games

位元組流、字元流涉及的類比較多,比較容易混淆。因此,有必要針對何時使用位元組流、何時使用字元流、何時使用Buffer類的流做一個歸納。要歸納它們,無需過多的語言,只需抓住它們的重點和特性即可。 在決定何時使用何種類時,以下幾個問題需要考慮清楚。 數據源:表示輸入,或稱為讀。可提供使用的兩個父類為Inpu ...


位元組流、字元流涉及的類比較多,比較容易混淆。因此,有必要針對何時使用位元組流、何時使用字元流、何時使用Buffer類的流做一個歸納。要歸納它們,無需過多的語言,只需抓住它們的重點和特性即可。

在決定何時使用何種類時,以下幾個問題需要考慮清楚。

  1. 是否有數據源、數據的流向是否有目標。
    • 數據源:表示輸入,或稱為讀。可提供使用的兩個父類為InputStream和Reader。
    • 有目標:表示輸出,或稱為寫。可提供使用的兩個父類為OutputStream和Writer。
  2. 應該使用位元組流還是字元流?如果源或目標包含非ascii字元,則採用字元流。
  3. 源和目標是何種設備類型。
    • 源 :磁碟文件File,記憶體(位元組/字元數組),鍵盤System.in,網路socket
    • 目標:磁碟文件File,記憶體(位元組/字元數組),屏幕System.out,網路socket
  4. 是否需要使用BufferedReader/BufferedWriter?這需要考慮是否需要額外的特殊功能,包括操作行,字元集轉換,使用緩衝區提高效率。字元集轉換過程中涉及了位元組流轉換為字元流的過程,可能需要使用InputStreamReader和OutputStreamWriter作為轉換的橋梁。

最後,需要知道的是對於使用BufferedReader的輸入流,有時候可以考慮使用字元數組可能效果和性能更好。

以下是一個應用以上規律的需求示例:讀取包含gbk簡體中文的文件數據,並以utf-8編碼複製到另一個文件中。

//1.有源有目標,且都是文件。 //2.讀取和寫入都包含中文字元,所以採用字元流。 //3.寫入過程中需要轉碼,因此需要使用OutputStreamWriter。 //4.可以使用緩衝區功能提高效率。

import java.io.*;


public class CP {
    public static void main(String[] args) throws IOException {
        File src = new File("d:/myjava/a.txt");
        File dest = new File("d:/myjava/a_bak.txt");
        cp(src,dest);
    }

    public static void cp(File src,File dest) throws IOException {
        BufferedReader bufr = new BufferedReader(new FileReader(src));
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));

        //按行讀取

        String line = null;
        while((line=bufr.readLine())!=null) {
            bufw.write(line);
            bufw.newLine();
            bufw.flush();
        }
        bufw.close();
    }
}

上述代碼執行後,目標文件中的末尾將比源文件多一個空行,上述方法對這個問題不是很好解決。但如果使用字元數組來替代BufferedReader,則沒有這樣的問題,如下。

import java.io.*;


public class CP {
    public static void main(String[] args) throws IOException {
        File src = new File("d:/myjava/a.txt");
        File dest = new File("d:/myjava/a_bak.txt");
        cp(src,dest);
    }

    public static void cp(File src,File dest) throws IOException {
    FileReader fr = new FileReader(src);
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));

    char[] buf = new char[1024];
    int len = 0;
    while ((len=fr.read(buf))!=-1) {
        bufw.write(buf,0,len);
        bufw.flush();
    }
    bufw.close();
    }
}

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


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

-Advertisement-
Play Games
更多相關文章
  • 一、系統設計 根據工程實踐經驗,系統設計總體來說可以精簡提煉分為兩個核心階段,即總體設計和詳細設計。 1、總體設計 總體設計的主要任務是把需求分析得到的結果轉換為軟體結構和數據結構,也就是確定軟體的主體系統結構。 設計軟體結構的具體任務是將一個複雜系統按功能進行模塊劃分、建立模塊的層次結構及調用關係 ...
  • 單例模式的作用就是在整個應用程式的生命周期中,單例類的實例都只存在一個,同時這個類還必須提供一個訪問該類的全局訪問點。 首先創建一個單例類,可以直接使用這個單例類獲得唯一的實例對象,也可以繼承該類,使用子類實例化對象。 下麵的代碼使用子類進行實例對象創建 Singleton.php文件 Single ...
  • Python 目錄 Mode one :開發基礎 第一章 基礎語法 1.python的起源 1.1.python的應用 1.2.python版本的選擇 1.3.python安裝 1.4.hello world 2.開啟python之路 2.1.變數 2.2數據類型 2.3.while迴圈 2.4.c ...
  • 今天想到了一個問題的演算法,就自己去敲了代碼運行,這個問題是經典的斐波那契數列求值。用了for迴圈、遞歸、尾遞歸運行了出來,突然想到一個問題for迴圈的時間複雜度、遞歸的時間複雜度、尾遞歸的時間複雜度那個更小呢?也就是那個演算法更加節省時間效率更高呢? 於是我就把這三個做了比較,發現for迴圈的效率更高 ...
  • #配置模塊#創建import configparserconfig = configparser.ConfigParser()#添加config["DEFAULT"] = {'ServerAliveInterval':'45', 'Compression':'yes', 'CompressionLe ...
  • 如果一個程式只包含固定數量的且其生命期都是己知的對象. 那麼這是一個非常簡單的程式。 通常,程式總是根據運行時才知道的某些條件去創建新對象。在此之前,不會知道所需對象的數量,甚至不知道確切的類型。為解決這個普遍的編程問題,需要在任意時刻和任意位置創建任意數量的對象。所以,就不能依靠創建命名的引用來持 ...
  • 現在正式開始第一篇博客。 先看一個式子: x+y+z=5 2*x+3*y+z=11 x+4*y+z=11 如果問人怎麼解,人家肯定會告訴你,消元啦~ 實際上消元有兩種:加減消元和帶入消元 在電腦上編程實現的話,加減消元會簡單一些。 這樣就有了我們的高斯消元法。 高斯消元就是有多個加減消元構成的,能夠 ...
  • 1.Java I/O 概述 2.Java I/O File類 3.Java I/O 獲取文件目錄並寫入到文本 4.Java I/O 輸入與輸出 5.Java I/O 複製文本文件 6.Java I/O 添加屬性和有用的介面 7.Java I/O Reader & Writer(字元流) 8.Java ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...