day35-IO流02

来源:https://www.cnblogs.com/liyuelian/archive/2022/09/10/16678379.html
-Advertisement-
Play Games

JavaOI流02 4.常用的類 4.1文件位元組流輸入流-FileInputStream InputStream抽象類是所有類位元組輸入流的超類 InputStream常用的子類: FileInputStream:文件位元組輸入流 BufferedInputStream:緩衝位元組輸入流 ObjectIn ...


JavaOI流02

4.常用的類

4.1文件位元組流輸入流-FileInputStream

InputStream抽象類是所有類位元組輸入流的超類

InputStream常用的子類:

  1. FileInputStream:文件位元組輸入流
  2. BufferedInputStream:緩衝位元組輸入流
  3. ObjectInputStream:對象位元組輸入流
image-20220910202405392 image-20220910162444888

常用方法:

image-20220910172448457

輸入流的唯一目的是提供通往數據的通道,程式可以通過這個通道讀取文件中的數據。

read方法提供了一個從輸入流讀取數據的基本方法,read方法的格式如下:

返回值 方法 說明
int read( ) 從輸入流中讀取數據的下一個位元組
int read(byte[ ] b) 從輸入流中讀取一定數量的位元組,並將其存儲在緩衝區數組 b 中。以整數形式返回讀取的位元組數。
int read(byte[ ] b, int off, int len) 將輸入流中最多 len 個數據位元組讀入 byte 數組。嘗試讀取 len 個位元組,但讀取的位元組也可能小於該值。以整數形式返回實際讀取的位元組數
void close( ) 關閉流

註:read方法在從輸入流中讀取源中的數據時,如果到達源的末尾,便會返回-1。

FileInputStream流順序地讀取文件,只要不關閉流,每次調用read方法就順序的讀取源中其餘的內容,直至源的末尾或流被關閉。

例子:

package li.io.inputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.IOException;

//演示FileInputStream的使用(位元組輸入流 文件-->程式)
public class FileInputStream_ {
    public static void main(String[] args) {

    }

    /**
     * 演示讀取文件
     * read():單個位元組的讀取,效率較低
     */
    @Test
    public void readFile01() {
        String filePath = "d:\\hello.txt";
        int readData = 0;
        FileInputStream fileInputStream = null;
        try {
            //創建了FileInputStream對象,用於讀取文件
            fileInputStream = new FileInputStream(filePath);
            //read()方法:從該輸入流讀取一個位元組的數據。 如果沒有輸入可用,此方法將阻止。
            //如果返回-1,則表示達到文件的末尾,表示讀取完畢
            while ((readData = fileInputStream.read()) != -1) {
                System.out.print((char) readData);//轉成char顯示,因此如果文件裡面有中文字元(每個中文字元占三個位元組),顯示的時候就會出現亂碼
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉文件流,釋放資源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 使用read(byte[] b)讀取文件,提高效率
     */
    @Test
    public void readFile02() {
        String filePath = "d:\\hello.txt";
        //位元組數組
        byte[] buf = new byte[8];//一次讀取8個位元組
        int readLen = 0;
        FileInputStream fileInputStream = null;
        try {
            //創建了FileInputStream對象,用於讀取文件
            fileInputStream = new FileInputStream(filePath);
            //read(byte[] b)方法:從該輸入流讀取最多b.length位元組的數據到位元組數組。
            //如果返回-1,則表示達到文件的末尾,表示讀取完畢
            //如果讀取正常,返回實際讀取的位元組數
            while ((readLen = fileInputStream.read(buf)) != -1) {
                System.out.print(new String(buf, 0, readLen));//顯示
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉文件流,釋放資源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

image-20220910172220291

4.2文件位元組輸出流-FileOutputStream

image-20220910180112035 image-20220910174155111

常用方法:

image-20220910175122065

例子:FileOutputStream應用實例1

要求:請使用FileOutputStream在a.txt文件中寫入“hello,world”。如果文件不存在,就先創建文件。

(註意:前提是目錄已經存在)

package li.io.outputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStream_ {
    public static void main(String[] args) {

    }

    /**
     * 演示使用FileOutputStream將數據寫到文件中,如果該文件不存在,則先創建文件
     */
    @Test
    public void writeFile() {

        String filePath = "d:\\a.txt";
        //創建FileOutputStream對象
        FileOutputStream fileOutputStream = null;

        try {
            //得到一個FileOutputStream對象
                /*
                如果是以new FileOutputStream(filePath)的方式創建對象,
                則當寫入內容時,會覆蓋原來的內容
    
                如果是以new FileOutputStream(filePath,true)的方式創建對象,
                則當寫入內容時,是在舊內容的末尾追加新內容
                */
            fileOutputStream = new FileOutputStream(filePath,true);//以追加的形式去添加新內容
            //寫入一個位元組
            //fileOutputStream.write('H');
            //寫入字元串
            String str = "Hello,Jack!";
            
            //String的getBytes方法可以將字元串轉為字元數組
            // fileOutputStream.write(str.getBytes());
            
            /*
            write(byte[] b,int off,int len)
            將len長度的位元組從位於偏移量off的指定位元組輸入寫入此文件輸出流
            */
            fileOutputStream.write(str.getBytes(), 0, 4);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

追加前:image-20220910180653006

追加後:image-20220910191405928

4.2.1FileInputStream&&FileOutputStream

應用實例2:文件拷貝

要求:完成文件拷貝,將d:\Koala.png拷貝到d:\Koala222.png

image-20220910192804613

在完成程式時,為防止讀取的文件過大,應該是每讀取部分數據,就寫入到指定文件,這裡使用迴圈。

package li.io.outputstream_;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) {
        //完成文件拷貝,將c:\\Koala.png拷貝到d:\\
        /*
        思路分析:
        1.創建文件的輸入流,將文件讀入到程式
        2.創建文件的輸出流,將讀取到的文件數據寫入指定的文件
         */

        String srcFilePath = "d:\\Koala.png";
        String destFilePath = "d:\\Koala222.png";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;

        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath, true);
            //定義一個位元組數組,提高效率
            byte[] buf = new byte[1024];//1K
            int readLen = 0;
            while ((readLen = fileInputStream.read(buf)) != -1) {
                //讀取到後,就通過 fileOutputStream寫入到文件
                //即,是一邊讀一邊寫)
                fileOutputStream.write(buf, 0, readLen);//一定要使用這個方法
            }
            System.out.println("拷貝成功~");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //關閉輸入流和輸出流,釋放資源
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
image-20220910194912571 image-20220910194859437

4.3文件字元流FileReader&FileWriter

image-20220910202331655

FileReader和FileWriter介紹:

FileReader和FileWriter是字元流,即按照字元來操作io

  • FileReader相關方法:

    • new FileReader(String/File)
    • read:每次讀取單個字元,返回該字元,如果到文件末尾返回-1
    • read(char[]):批量讀取多個字元到數組,返回讀取到的字元數,如果到文件末尾就返回-1

    相關API:

    1. new String(char[]):將char[]轉換成String
    2. new String(char[],off,len):將char[]的制定部分轉換成String
  • FileWriter常用方法:

    • new FileWriter(File/String):覆蓋模式,相當於流的指針在首端
    • new FileWriter(File/String,true):追加模式,相當於流的指針在尾端
    • writer(int):寫入單個字元
    • writer(char[]):寫入指定數組
    • writer(char[],off,len):寫入指定數組的指定部分
    • writer(String):寫入整個字元串
    • writer(String,off,len):寫入指定字元串的指定部分

    相關API:String類:toCharArray:將String轉換成char[]

    註意:FileWriter使用後,必須要關閉(close)或刷新(flush),否則寫入不到指定的文件!


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

-Advertisement-
Play Games
更多相關文章
  • 最近工作需要,研究了一些Liunx性能工具,發現sar這個工具非常優秀。sar是一個非常全面的一個分析工具,對文件的讀寫,系統調用的使用情況,磁碟IO,CPU相關使用情況,記憶體使用情況,進程活動等都可以進行有效的分析。sar工具將對系統當前的狀態進行取樣,然後通過計算數據和比例來表達系統的當前運行狀 ...
  • 2022-09-10 MySQL中的自連接 何謂自連接? 自連接,即為自己查自己,本表查詢本表。 自連接一般使用於何種地方? 例如:如果在設計一張表中,表中的欄位名包含id(省份/市的郵政編碼),title(省份名/市級名),cid(如果前面title是省份名,那麼此處為空;如果前面title是市級 ...
  • 《Redis 7.x 入門和開發實戰》技術專欄通過基礎知識介紹入門-環境搭建-項目開發實踐,讓初學者快速掌握Redis。內部包括分散式緩存組件Redis 7.x的安裝配置部署、基本數據類型、常用命令、操作實踐、HyperLoglog數據結構、事務、慢日誌分析、Redis 集成 Spring Boot... ...
  • 1.視圖:view 視圖就是一張虛擬的表。表是真正存數據的,視圖只是顯示查詢結果。 視圖的作用:隱藏表的結構、簡化sql嵌套查詢操作 註意:視圖就是你要查詢數據的一個中間結果集,我們一般只用來做數據查詢的 創建視圖:create view view_name as 查詢語句 例如: mysql> c ...
  • 多用戶即時通訊系統 包含推消息 私聊 發文件 等功能 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 為什麼選擇這個項目 有趣 涉及到java各個方面的技術 ✔項目框架設計 ✔java面向對象編程 ✔網路編程 ✔多線程 ✔IO流 ✔ ...
  • 一個菜鳥的設計模式之旅,本程式實現觀察者模式。使用C#、Go兩門語言分別進行實現。程式創建一個全局游戲死亡事件通知,5個玩家、1個Boss,當任意一方死亡時,在場存活者都能收到陣亡者的消息。 ...
  • 第一步檢查環境變數 打開cmd 查看以下環境變數 需要軟體: Typora PicGo gitee賬號 配置node 配置git 第二步創建gitee倉庫 設置倉庫名直接創建,因為這裡不能直接修改開源,需要在設置修改 找到剛剛創建的倉庫 點擊管理往下拉設置開源 然後點擊設置私人令牌 生成新令牌 寫個 ...
  • 2022-09-10 閉包的使用實例 1 def config_name(name): 2 def inner(msg): 3 print(name + ":" + msg) 4 5 print(id(inner)) 6 return inner 7 8 A = config_name("A") 9 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...