Java IO流(一)IO基礎

概述

IO流本質
  • I/O表示Input/Output,即數據傳輸過程中的輸入/輸出,并且輸入和輸出都是相對于內存來講
  • Java IO(輸入/輸出)流是Java用于處理數據讀取和寫入的關鍵組件
  • 常見的I|O介質包括
    • 文件(輸入|輸出)
    • 網絡(輸入|輸出)
    • 鍵盤(輸出)
    • 顯示器(輸出)
  • 使用場景
    • 文件拷貝(File)
    • 文件上傳下載
    • Excel導入導出
    • 網絡程序中數據傳輸(聊天工具)

分類

概述

Java中幾乎所有的IO操作都需要使用java.io包;流可以通過如下方式進行分類

  • 按流向分(輸入輸出過程通常都是站在程序角度考慮)
    • 輸入流(Input)
    • 輸出流(Output)
  • 按流的處理類型分
    • 字節流(byte): 字節是計算機存儲容量的基本單位(Byte),1B=8b,二進制中占8位
    • 字符流(char): 字符是文字或符號的統稱

????????注意:字節流對于什么類型的文件都可以讀取,如二進制類型的文件(圖片,視頻,音頻,壓縮? ? ? ? ? ? ? ? ? ? 文件等),而字符流用于讀取文本類型文件

  • 按流的功能來分
    • 節點流(直接跟輸入輸出源交互)
    • 處理流(對其他流包裝的流:包裝流)

字節流(InputStream && OutputStream)

InputStream 類圖
OutputStream類圖

日常開發過程中常用的字節流:

FileInputStream && FileOutputStream:?常用來實現文件復制/拷貝

BufferedInputStream && BufferedOutputStream:?為了減少IO次數,提高讀取效率

PrintStream:源自OutputStream,標準字節的打印輸出流(日志框架的實現原理)

ZipOutputStream && ZipInputStream:用來進行文件壓縮/文件解壓

字符流(Reader && Writer)

Reader類圖
Writer類圖

日常開發過程中常用的字符流:

FileReader&&FileWriter:作用同FileInputStream && FileOutputStream

BufferedReader&&BufferedWriter:作用同BufferedInputStream && BufferedOutputStream,同時BufferedReader提供了按行讀取文本的方法,方便文本處理

擴展: 我們知道字節流可以讀取任意文件,為什么還要設計出字符流呢?

  • 對于字符文件,先作為字節傳輸->再轉成字符,比較耗時
  • 對于字符文件,如果其中為中文,則容易亂碼

設計模式

在IO流中使用了多種設計模式,包括如下:

適配器模式

適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作

Java IO中為了實現字符流和字節流之間的相互轉換,設計了兩個適配器的類,

InputStreamReader和OutputStreamWriter

InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(isr);

裝飾器模式

裝飾器模式可以將新功能動態地附加于現有對象而不改變現有對象的功能。InputStream的子類FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有Writer的子類BufferedWriter、FilterWriter 以及 PrintWriter等,它們都是抽象裝飾類。增強了子類對象的功能。

實踐

ZipOutputStream&&FileOutputStream&&FileInputStream實現文件壓縮

/*** 功能: 通過ZipOutputStream壓縮文件,最后返回壓縮包* @param files* @param fileName* @return*/
public File zipFiles(File[] files,String fileName) {File zipFile = null;FileOutputStream fosZipFile = null;ZipOutputStream zosZipFile = null; //壓縮文件輸出流try {zipFile = downloadAttachmentService.createFile("", fileName); //創建一個空的文件目錄fosZipFile = new FileOutputStream(zipFile); //以文件流從內存中輸出zosZipFile = new ZipOutputStream(fosZipFile); //以壓縮流從內存中輸出for (File file : files) {FileInputStream fis = new FileInputStream(file); //對每個文件創建輸入流,讀取文件到內存ZipEntry zipEntry = new ZipEntry(file.getName()); //ZipEntry用來創建壓縮文件zosZipFile.putNextEntry(zipEntry); //加入需要壓縮的文件byte[] bytes = new byte[1024];int length;while((length = fis.read(bytes)) >= 0) { //讀取文件到內存zosZipFile.write(bytes, 0, length); //文件寫入壓縮流}fis.close();}} catch (IOException e) {e.printStackTrace();} finally { //關閉流try {zosZipFile.close();fosZipFile.close();} catch (IOException e) {e.printStackTrace();}}return zipFile; //返回壓縮包
}
/*** @Title: createFile* @Description: 創建下載目錄文件* @author Bierce* @param rootPath* @param filename* @return* @throws IOException*/
public File createFile(String rootPath, String filename) throws IOException {// Default root pathif (rootPath.isEmpty()) {rootPath = "download-cache";}File fRoot = new File(rootPath);if (!fRoot.exists() || !fRoot.isDirectory()) {fRoot.mkdirs();}// job sub pathString uuid = UUID.randomUUID().toString();String directoryJob = rootPath + File.separator + getClass().getSimpleName() + File.separator + uuid;//文件名稱隨機生成保證唯一File dirJob = new File(directoryJob);if (!dirJob.exists() || !dirJob.isDirectory()) {dirJob.mkdirs();}String filePath = directoryJob + File.separator + filename;File file = new File(filePath);if (!file.exists()) {file.createNewFile();}return file;
}
//-----------------擴展方法-文件名去重保證唯一-----------------
/*** @Title: snFileName_noUIID* @Description: 去除sn文件UUID以及解決sn文件名重復問題* @author Bierce* @return file*/
public File snFileName_noUIID(String fileParentPath,String snFileName,File file){//snFileName:完整文件名 sn-xx..UUID..xx.xlsx//snFileName_delUIID: sn.xlsx//snFileName_prefix: sn//suffix:xlsx//文件名:如sn.xlsxString snFileName_delUIID = snFileName.substring(0,snFileName.length() - 42) + ".xlsx";//42是固定長度:UUID+.xlsxString snFileName_prefix = snFileName.substring(0,snFileName.length() - 42);//文件前綴String suffix = snFileName.substring(snFileName.lastIndexOf("."));//文件后綴:.xlsxtry {file = new File(fileParentPath + snFileName_delUIID);//設置sn文件所在目錄為計劃交接文件目錄下int i = 1;//對于同名SN文件情況重新命名while(file.exists()) {//保證文件夾下不存在同名文件String newFileName = snFileName_prefix + "(" + i + ")" + suffix;String parentPath = file.getParent();file = new File(parentPath + File.separator + newFileName);i++;}file.createNewFile();//new File 只是創建了一個File對象,還需要調用createNewFile()方法才能實現文件的成功創建} catch (Exception e) {}return file;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42391.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python自帶的IDLE有什么用

在Python的官方解釋器中,自帶了一個名為IDLE(Interactive DeveLopment Environment)的集成開發環境。 一、簡化代碼調試過程 很多初學者在編寫Python代碼時,經常會遇到一些問題需要調試。而在IDLE中,我們可以通過設置斷點、單步調試等方法&…

算法競賽入門【碼蹄集新手村600題】(MT1160-1180)C語言

算法競賽入門【碼蹄集新手村600題】(MT1160-1180)C語言 目錄MT1161 N的零MT1162 數組最大公約數MT1163 孿生質數MT1164 最大數字MT1165 卡羅爾數MT1166 自守數MT1167自守數IIMT1168 階乘數MT1169 平衡數MT1170 四葉玫瑰數MT1171 幻數MT1172 完美數字MT1173 魔數MT11…

es線上處理命令記錄

常用命令 搜索 GET _search {"query": {"match_all": {}} }獲取全部模版 GET _index_template GET _index_template/yst_crawler_template獲取全部索引 GET /_cat/indices?v 獲取當前mapping GET /yst_crawler/_mapping創建一個mapping PUT /yst_c…

WebGL游戲站優化實錄【myshmup.com】

myshmup.com 允許在瀏覽器中創建 shmup(射擊)游戲。 你可以使用具有創意通用許可證的資源或上傳自己的藝術作品和聲音。 創建的游戲可以在網站上發布。 該平臺不需要編碼,游戲對象的配置是在用戶界面的幫助下執行的。 后端是使用Django框架開…

機器學習筆記 - 使用 ResNet-50 和余弦相似度的基于圖像的推薦系統

一、簡述 這里的代碼主要是基于圖像的推薦系統,該系統利用 ResNet-50 深度學習模型作為特征提取器,并采用余弦相似度來查找給定輸入圖像的最相似嵌入。 該系統旨在根據所提供圖像的視覺內容為用戶提供個性化推薦。 二、所需環境 Python 3.x tensorflow ==2.5.0 numpy==1.21.…

星際爭霸之小霸王之小蜜蜂(三)--重構模塊

目錄 前言 一、為什么要重構模塊 二、創建game_functions 三、創建update_screen() 四、修改alien_invasion模塊 五、課后思考 總結 前言 前兩天我們已經成功創建了窗口,并將小蜜蜂放在窗口的最下方中間位置,本來以為今天將學習控制小蜜蜂,結…

GPT-4一紙重洗:從97.6%降至2.4%的巨大挑戰

斯坦福大學和加州大學伯克利分校合作進行的一項 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明,隨著時間的推移,GPT-4 的響應能力非但沒有提高,反而隨著語言模型的進一步更新而變得更糟糕。 研究小組評估了 2023 年 3 月和 20…

win10安裝mysql和c++讀取調用舉例

一、下載mysql8.rar解壓到C盤(也可以解壓到其他位置) 在系統環境變量添加JAVA_HOMEC:\myslq8,并在path中添加%JAVA_HOME%\bin; 二、以管理員身份進入命令窗口 三、修改配置文件指定安裝路徑和數據庫的存放路徑 四、鍵入如下命令初始化并啟動mysql服務,然后修改登錄…

Rust之泛型、trait與生命周期

泛型是具體類型或其他屬性的抽象替代。在編寫代碼時,可以直接描述泛型的行為,或者它與其他泛型產生的聯系,而無須知曉它在編譯和運行代碼時采用的具體類型。 1、泛型數據類型: 們可以在聲明函數簽名或結構體等元素時使用泛型&am…

TDD(測試驅動開發)?

01、前言 很早之前,曾在網絡上見到過 TDD 這 3 個大寫的英文字母,它是 Test Driven Development 這三個單詞的縮寫,也就是“測試驅動開發”的意思——聽起來很不錯的一種理念。 其理念主要是確保兩件事: 確保所有的需求都能被照…

macOS Ventura 13.5.1(22G90)發布(附黑/白蘋果系統鏡像地址)

系統鏡像下載:百度:黑果魏叔 系統介紹 黑果魏叔 8 月 18 日消息,蘋果今日向 Mac 電腦用戶推送了 macOS 13.5.1 更新(內部版本號:22G90),本次更新距離上次發布隔了 24 天。 本次更新重點修復了…

Redis 緩存過期及刪除

一、Redis緩存過期策略 物理內存達到上限后,像磁盤空間申請虛擬內存(硬盤與內存的swap),甚至崩潰。 內存與硬盤交換 (swap) 虛擬內存,頻繁I0 性能急劇下降,會造成redis內存急劇下降; 一般設置物理內存的3/4,在redis…

內存不足V4L2 申請DMC緩存報錯問題

當內存不足時,V4L2可能存在申請DMA緩存報錯,如下日志: 13:36:54:125 [15070.640862] rkcifhw fdfe0000.rkcif: swiotlb buffer is full (sz: 1843200 bytes) 13:36:54:125 [15070.640891] rkcifhw fdfe0000.rkcif: swiotlb: coherent allocation failed, size=1843200 13:3…

超分辨率地震速度模型

文獻分享 1. Multitask Learning for Super-Resolution 原題目:Multitask Learning for Super-Resolution of Seismic Velocity Model 全波形反演(FWI)是估算地下速度模型的強大工具。與傳統反演策略相比,FWI充分利用了地震波的…

typedef

t y p e d e f typedef typedef 聲明&#xff0c;簡稱typedef&#xff0c;是創建現有類型的新名字。 比如&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n;scanf("%lld",&n);printf("%lld"…

C++ 面向對象三大特性——多態

?<1>主頁&#xff1a;我的代碼愛吃辣 &#x1f4c3;<2>知識講解&#xff1a;C 繼承 ??<3>開發環境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向對象三大特性的&#xff0c;封裝&#xff0c;繼承&#xff0c;多態&#xff…

30W IP網絡有源音箱 校園廣播音箱

SV-7042XT是深圳銳科達電子有限公司的一款2.0聲道壁掛式網絡有源音箱&#xff0c;具有10/100M以太網接口&#xff0c;可將網絡音源通過自帶的功放和喇叭輸出播放&#xff0c;可達到功率30W。同時它可以外接一個30W的無源副音箱&#xff0c;用在面積較大的場所。5寸進口全頻低音…

RNN模型簡單理解和CNN區別

目錄 神經網絡&#xff1a;水平方向延伸&#xff0c;數據不具有關聯性 ? RNN&#xff1a;在神經網絡的基礎上加上了時間順序&#xff0c;語義理解 ?RNN: 訓練中采用梯度下降&#xff0c;反向傳播 ? 長短期記憶模型 ?輸出關系&#xff1a;1 toN&#xff0c;N to N 單入…

Spring三級緩存

目錄 循環依賴問題 三級緩存 三級緩存創建Bean的流程&#xff08;解決循環依賴問題&#xff09; 三級緩存的局限性 Spring的三級緩存是為了解決單例Bean的循環依賴問題而存在的。 循環依賴問題 簡單來說就是A依賴B&#xff0c;而B又依賴A。即創建A的時候&#xff0c;需要先…

【HarmonyOS】【DevEco Studio】ohpm安裝失敗該如何解決?

【關鍵詞】 HarmonyOS、DevEco Studio、ohpm安裝失敗 【問題背景及解決方案】 最近遇到很多DevEco Studio安裝ohpm失敗的問題&#xff0c;下面給大家介紹幾種出現的問題以及解決方案&#xff1a; 1、ohpm not set up&#xff0c;報錯截圖如下&#xff1a; ? 解決方案&…