Java IO學習筆記四

来源:http://www.cnblogs.com/Chenjiabing/archive/2017/05/26/6906776.html
-Advertisement-
Play Games

記憶體操作流 之前的所有的流操作都是針對文件的,但是有時候只是想要實現數據間轉換,此時如果我們想要創建一個文件然後再刪除文件,那樣顯得有點麻煩,因此此時的記憶體操作流就顯得很適合這類的操作,因為它只是在記憶體中存儲,並不會真正的創建文件,記憶體操作流涉及的兩個類是 ,`ByteArrayOutputStre ...


記憶體操作流

之前的所有的流操作都是針對文件的,但是有時候只是想要實現數據間轉換,此時如果我們想要創建一個文件然後再刪除文件,那樣顯得有點麻煩,因此此時的記憶體操作流就顯得很適合這類的操作,因為它只是在記憶體中存儲,並不會真正的創建文件,記憶體操作流涉及的兩個類是ByteArrayInputStream,ByteArrayOutputStream.

ByteArrayInputStream

  • ByteArrayInputStream 包含一個內部緩衝區,該緩衝區包含從流中讀取的位元組。內部計數器跟蹤read方法要提供的下一個位元組。
  • 關閉 ByteArrayInputStream無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException
  • 主要的功能是從緩衝區讀取位元組

構造函數

  • ByteArrayInputStream(byte[] buf) 創建一個 ByteArrayInputStream,使用 buf 作為其緩衝區數組。
  • ByteArrayInputStream(byte[] buf, int offset, int length) 創建 ByteArrayInputStream,使用 buf 作為其緩衝區數組。

常用的方法

  • close() 不過對這個無效,因為關閉之後仍然可以使用函數讀取而不報錯
  • int read() 從緩衝區中讀取一個位元組
  • int read(byte[] bytes) 將緩衝區中的內容讀取到數組中
  • int read(byte[] bytes,int off,int len) 將最多 len 個數據位元組從此輸入流讀入 byte 數組。
  • long skip(long n) 從此輸入流中跳過n 個輸入位元組。
  • void reset() 將此 byte 數組輸出流的 count 欄位重置為零,從而丟棄輸出流中目前已累積的所有輸出(清除緩衝區)

實例

public class demo8 {
    public static void main(String args[]) {
        String str = "chenjiabing\n陳加兵";
        byte[] bytes = str.getBytes();  //創建一個數組
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);  //使用bytes作為緩衝區數組
        int temp = 0;
        /*第一種方法讀取緩衝區中的數據,這個和文件的操作不一樣,這個可以直接沖緩衝區中讀取數據位元組*/
        while ((temp = inputStream.read()) != -1) {
            System.out.print((char) temp);
        }

        /*創建數組用於存儲讀取的內容,下麵是第二種讀取數據的方法*/
        byte[] b = new byte[bytes.length];
        try {
            int len = inputStream.read(b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(new String(b));

    }

}

ByteArrayOutputStream

  • 此類實現了一個輸出流,其中的數據被寫入一個byte 數組。緩衝區會隨著數據的不斷寫入而自動增長。可使用 toByteArray() 和 toString() 獲取數據。
  • 關閉 ByteArrayOutputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException

構造函數

  • ByteArrayOutputStream() 創建一個新的 byte數組輸出流。
  • ByteArrayOutputStream(int size) 創建一個新的 byte 數組輸出流,它具有指定大小的緩衝區容量(以位元組為單位)。

常用函數

  • int size() 返回緩衝區的當前大小。
  • byte[] toByteArray() 創建一個新分配的 byte 數組。
  • String toString() 將緩衝區的位元組轉換成字元串
  • void write(byte[] b, int off, int len) 將指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此 byte 數組輸出流。
  • void write(int b) 將指定的位元組寫入此 byte數組輸出流。

實例

public class demo8 {
    public static void main(String args[]) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        String str = "chenjiabing";
        try {
            outputStream.write(str.getBytes());   //將字元串轉換成數組然後寫入緩衝區
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();  //這裡的關閉無效
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //將緩衝區的數據轉換成字元串後輸出,這裡同樣可以看出輸出流的關閉根本不影響函數的調用
        System.out.println(outputStream.size());  //輸出緩衝區的大小
        System.out.println(outputStream.toString());  //輸出chenjiabing
        outputStream.reset();   //清除緩衝區的內容,如果不清零那麼原先寫入的數據還是存在的,但是此時我們已經不需要前面的數據了
        try {
            outputStream.write("陳加兵".getBytes());  //繼續向緩衝區寫入數據
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(outputStream.size());  //這裡的一個漢字占了三個位元組
        System.out.println(outputStream.toString());//輸出陳加兵


    }

}

綜合

下麵我們結合上面的兩個類將字元串轉換大小寫

public class demo8 {
    public static void main(String args[]) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        String str = "chenjiabing";
        ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());  //實例化輸入流
        int temp = 0;
        while ((temp = inputStream.read()) != -1)   //讀取緩衝區的位元組數據
        {
            char c = (char) temp;  //將整數轉換成字元,ascii碼的轉換
            outputStream.write(Character.toUpperCase(c));  //轉換成大寫,然後寫入輸出流的緩衝區中
        }
        System.out.println(outputStream.toString());   //利用輸出流輸出轉換後的字元串,即是去取出記憶體中的數據


    }

}

參考文章


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

-Advertisement-
Play Games
更多相關文章
  • System對IO的支持 是系統的類,其中的方法都是在控制台的輸入和輸出,但是通過重定向也是可以對文件的輸入輸出 中定義了標準輸入、標準輸出和錯誤輸出流,定義如下: 1. “標準”錯誤輸出流。 2. “標準”輸入流。 3. “標準”輸出流。 從上面的定義可以知道這裡的返回值都是位元組的輸入和輸出流,因 ...
  • 本書通篇都是以情景對話的形式,用多個小故事或編程示例來組織講解GoF(設計模式的經典名著——Design Patterns:Elements of Reusable Object-Oriented Software,中譯本名為《設計模式——可復用面向對象軟體的基礎》的四位作者Erich Gamma、 ...
  • 控制套接字的行為(如修改緩衝區的大小)。 int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen); int setsockopt(int sockfd,int level,int optname, ...
  • 作者Brett Slatkin是 Google公司高級軟體工程師。他是Google消費者調查項目的工程主管及聯合創始人,曾從事Google App Engine的Python基礎架構工作,並利用Python來管理眾多的Google伺服器。Slatkin也是PubSubHubbub協議的聯合創始人,還 ...
  • “註解”這個詞,可謂是在Java編程中出鏡率比較高,而且也是一個老生常談的話題。我們之前在聊Spring相關的東西時,註解是無處不在,之前我們簡單的聊過一些“註解”的相關內容,比如在Spring中是如何進行“註解”組合的。因為註解在Java編程中還是比較重要的,所以我們今天的博客就把註解的東西給系統 ...
  • 問題:Firemonkey Android 平臺顯示斜粗體文字時,文字右方會有顯示不全的問題。 修正代碼: 請將 FMX.FontGlyphs.Android.pas 複製到自己的工程目錄下,再修改如下代碼: 修正效果: ...
  • 數據源連接池配置 ...
  • 列印流 在整個 包中,列印流是輸出信息最方便的類,主要包含 位元組列印流 ( )和 字元列印流 ( )。列印流提供了非常方便的列印功能,可以列印任何的數據類型,例如:小數、整數、字元串等等,相對於前面學習的幾個文件的操作來說,這裡的列印流是最簡便的一個類了 PrintStream 主要功能是格式化的將 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...