菜鳥之路Day15一一IO流(一)

菜鳥之路Day15一一IO流(一)

作者:blue

時間:2025.2.8

文章目錄

  • 菜鳥之路Day15一一IO流(一)
    • 0.概述
    • 1.初識IO流
      • 1.1.什么是IO流?
      • 1.2.IO流的作用
      • 1.3.IO流的分類
    • 2.IO流的體系結構
    • 3.字節輸出流的基本用法
    • 4.字節輸入流的基本用法
    • 5.異常處理(了解即可)
    • 6.字符集
    • 7.字符輸入流
      • 7.1FileReader
      • 7.2FileWriter
    • 8.IO流綜合練習
      • 8.1練習一
      • 8.2練習二
      • 8.3練習三

0.概述

文章內容,學習自黑馬程序員BV1yW4y1Y7Ms

1.初識IO流

1.1.什么是IO流?

答:存儲和讀取數據的解決方案

1.2.IO流的作用

答:用于讀寫數據(本地文件,網絡)

1.3.IO流的分類

按流的方向分

在這里插入圖片描述

按操作文件的類型分

在這里插入圖片描述

2.IO流的體系結構

在這里插入圖片描述

3.字節輸出流的基本用法

FileOutputStream :操作本地文件的字節輸出流,可以把程序中的數據寫到本地文件中

書寫步驟:

①創建字節輸出流對象

? 細節1:參數是字符串表示的路徑或者File對象都是可以的

? 細節2:如果文件不存在會創建一個新的文件,但是要保證父級路徑是存在的

? 細節3:如果文件已經存在,則會清空文件

②寫數據

? 細節:write方法的參數是整數,但是實際上寫到本地文件中的是整數在ASCII上對應的字符

③釋放資源

? 細節:每次使用完流之后都要釋放資源

package IOStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo1 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt");//①創建字節輸出流對象fos.write(97);//②寫數據fos.close();//③釋放資源}
}

寫出數據的三種方式

public class FileOutputStreamDemo2 {public static void main(String[] args) throws IOException {/** void write(int b) 一次寫一個字節數據* void write(byte[] b) 一次寫一個字節數組數據** void write(byte[] b,int off,int len) 一次寫一個字節數組的部分數據* 參數一:數組* 參數二:起始索引 0* 參數三:個數 3* */FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt");byte[] b = {97,98,99,100,101};fos.write(b,1,2);}
}

換行和續寫

public class FileOutputStreamDemo3 {public static void main(String[] args) throws IOException {/** 換行符:*   windows:\r\n*   Linux:\n*   Mac:\r* 續寫:*   打開續寫開關即可,即創建對象的第二個參數*   默認是false表示關閉,創建對象會清空文件*   傳遞true,表示打開續寫,此時創建對象不會清空文件* */FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt",true);String str1 = "kcbdkdvkdkjxkjdkj";String str2 = "\r\n";String str3 = "666";byte[] b1 = str1.getBytes();byte[] b2 = str2.getBytes();byte[] b3 = str3.getBytes();fos.write(b1);fos.write(b2);fos.write(b3);}
}

4.字節輸入流的基本用法

FileInputStream:操作本地文件的字節輸入流,可以把本地文件中的數據讀取到程序中來

書寫步驟:

①創建字節輸入流對象

? 細節1:如果文件不存在,就直接報錯

②讀數據

? 細節1:一次讀一個字節,讀出來的數據在ASCII上對應的數字

? 細節2:讀到文件末尾了,read方法返回-1

③釋放資源

? 細節:每次使用完流之后都要釋放資源

public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\IOStream\\a.txt");int ans = fis.read();while(ans!=-1){System.out.print((char)ans);ans = fis.read();}fis.close();//釋放資源}
}

文件拷貝的基本代碼

思想:邊讀邊寫

public class FileInputStreamDemo2 {public static void main(String[] args) throws IOException {//1.創建對象FileInputStream fis = new FileInputStream("C:\\Users\\zhangtenlan\\Desktop\\abc.txt");FileOutputStream fos = new FileOutputStream("src\\IOStream\\ans.txt");//2.拷貝//核心思想:邊讀邊寫int b;while((b=fis.read())!=-1){fos.write(b);}//3.釋放資源//規則:先開的最后關閉fos.close();fis.close();}
}

以上方法在拷貝大文件的時候速度非常的慢,原因就在于,每次只能讀取一個字節的數據,我們可以用read方法的一個重載來一次性讀取多個數據。

public int read(byte[] buffer)  //一次讀一個字節數組數據
//注意:一次讀一個字節數組的數據,每次讀取會盡可能把數組裝滿
//長度盡量設置為1024的整數倍,不要太大,像1024*1024*5

例子:

public class FileInputStreamDemo3 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\IOStream\\ans.txt");byte[] b = new byte[2];int len;while((len=fis.read(b))!=-1){ //當讀到的長度為-1時代表讀完了System.out.print(new String(b,0,len));}fis.close();}
}

拷貝大文件的寫法

public class FileInputStreamDemocratic {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();//記錄開始時間//1.創建對象FileInputStream fis = new FileInputStream("大文件");FileOutputStream fos = new FileOutputStream("目標位置");//2.拷貝int len;byte[] bytes = new byte[1024*1024*5];while((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}//3.釋放資源fos.close();fis.close();long end = System.currentTimeMillis();//記錄結束時間System.out.println(end-start);//看看程序運行花了多少時間}
}

5.異常處理(了解即可)

try{}catch(IOException e){}finally{//finally中代碼一定執行,除非JVM退出//所以釋放資源的代碼寫到這里再合適不過
}

6.字符集

1.在計算機中,任意數據都是以二進制的形式來存儲的

2.計算機中最小的存儲單元是一個字節

3.ASCII字符集中,一個英文占一個字節

4.簡體中文版Windows,默認使用GBK字符集

5.GBK字符集完全兼容ASCII字符集

? 注意:一個英文占一個字節,二進制第一位是0

? 一個中文占兩個字節,二進制高位字節的第一位是1

6.Unicode字符集的UTF-8編碼格式

? 注意:一個英文占一個字節,二進制第一位是0,轉成十進制是正數

? 一個中文占三個字節,二進制第一位是1,第一個字節轉成十進制是負數

為什么會有亂碼?

原因1:讀取數據時未讀完整個漢字

原因2:編碼和解碼時的方式不統一

Java中的解碼和編碼:

public class FileInputStreamDemo5 {public static void main(String[] args) throws UnsupportedEncodingException {/** java中的編碼方法*   public byte[] getBytes() 使用默認方式進行編碼UTF-8*   public byte[] getBytes(String charsetName) 使用指定方式進行編碼** java中的解碼方法*   String(byte[] bytes) 使用默認方式進行解碼UTF-8*   String(byte[] bytes,String charsetName) 使用指定方式進行解碼* */String str = "你好";byte[] res1 = str.getBytes();System.out.println(Arrays.toString(res1));System.out.println("=========================================================================");byte[] res2 = str.getBytes("GBK");System.out.println(Arrays.toString(res2));System.out.println("=========================================================================");String ans1 = new String(res1);System.out.println(ans1);System.out.println("=========================================================================");String ans2 = new String(res2,"GBK");System.out.println(ans2);}
}

7.字符輸入流

在這里插入圖片描述

字符流

? 字符流 = 字節流+字符集

特點

? 輸入流:一次讀一個字節,遇到中文時,一次讀多個字節(所以適合處理中文)

? 輸出流:底層會把數據按照指定的編碼方式進行編碼,變成字節再寫到文件中

使用場景

? 對于純文本文件進行讀寫操作

書寫步驟

? ①創建字符輸入流對象

? ②讀取數據

? 注意:細節1:按字節進行讀取,遇到中文,一次讀多個字節,讀取后解碼,返回一個整數

? 細節2:讀到文件末尾了,read方法返回-1

? ③釋放資源

7.1FileReader

public class IOTestOne {public static void main(String[] args) throws IOException {/** 第一步:創建對象* public FileReader(File file)  創建字符輸入流關聯本地文件* public FileReader(String pathname)** 第二步:讀取數據* public int read() 讀取數據,讀到末尾返回-1* public int read(char[] buffer) 讀取多個數據,讀到末尾返回-1** 第三步:釋放資源* public void close 釋放資源* */FileReader fr = new FileReader("src\\IOTest\\a.txt");int ch;while((ch=fr.read())!=-1){System.out.print((char)ch);}fr.close();}
}/*有參的readFileReader fr = new FileReader("src\\IOTest\\a.txt");char[] chars = new char[2];int len;while((len=fr.read(chars))!=-1){//有參read返回值是System.out.print(new String(chars,0,len));}r.close();
*/

7.2FileWriter

①創建字符輸出流對象

? 細節1:參數是字符串表示的路徑或者是File對象都可以

? 細節2:如果文件不存在會創建一個新的文件,但是要保證父級路徑是存在的

? 細節3:如果文件已經存在,則會清空文件,如果不想清空可以打開續寫開關

②寫數據

? 細節:如果write方法的參數是整數,但是實際上寫到本地文件中的是整數在字符集上對應的字符

③釋放資源

? 細節:每次使用完流之后都要釋放資源

public class IOTestTwo {public static void main(String[] args) {/** 第一步:創建對象*   public FileWriter(File file)*   public FileWriter(String pathname)*   public FileWriter(File file,boolean append) 續寫開關*   public FileWriter(String pathname,boolean append)** 第二步:讀取數據*   void write(int c)*   void write(String str)*   void write(String str,int off,int len)*   void write(char[] cbuf)*   void write(char[] cbuf,int off,int len)** 第三步:釋放資源*   public void close() * */}
}

8.IO流綜合練習

字節流和字符流的使用場景

? 字節流:拷貝任意類型的文件

? 字符流:讀取純文本文件中的數據,往純文本文件中寫出數據

8.1練習一

拷貝文件夾,考慮子文件夾

public class Test1 {public static void main(String[] args) throws IOException {File src = new File("C:\\Users\\zhangtenlan\\Desktop\\src");//數據源File dest = new File("C:\\Users\\zhangtenlan\\Desktop\\dest");//目的地copydir(src,dest);}private static void copydir(File src, File dest) throws IOException {dest.mkdirs();//1.進入數據源File[] arr = src.listFiles();//2.遍歷數據源for(File file:arr){//3.如果是文件,則拷貝if(file.isFile()) {FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));byte[] bytes = new byte[1024];int len;//邊讀邊寫while((len= fis.read(bytes))!=-1){fos.write(bytes,0,len);}fos.close();fis.close();}//4.如果是文件夾,則遞歸else {copydir(file,new File(dest,file.getName()));}}}
}

8.2練習二

文件加密

為了保證文件的安全性,就需要對原始文件進行加密存儲,再使用的時候再對其進行解密處理。

加密原理:

? 對原始文件中的每一個字節數據進行更改,然后將更改以后的數據存儲到新文件中

解密原理:

? 讀取加密之后的文件,按照加密規則反向操作,變成原始文件

//完成這個功能,我們可以利用異或的原理
//加密,我們可以令每個字節都異或上一個數字
public class Test2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\yuan.png");FileOutputStream fos = new FileOutputStream("src\\jiami");int b;while((b=fis.read())!=-1){fos.write(b^5);}fos.close();fis.close();}
}
//解密,我們取原來加密過的圖片,再次異或上這個數字
public class Test2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\jiami");FileOutputStream fos = new FileOutputStream("src\\jiemi.png");int b;while((b=fis.read())!=-1){fos.write(b^5);}fos.close();fis.close();}
}

8.3練習三

文本文件中有以下數據:2-1-9-4-7-8

將文本中的數據進行排序,變成以下數據:1-2-4-7-8-9

public class Test3 {public static void main(String[] args) throws IOException {//1.讀取數據//純文本文件,可以使用字符流來操作FileReader fr = new FileReader("src\\a.txt");StringBuilder sb = new StringBuilder();int b;while((b=fr.read())!=-1){sb.append((char)b);}fr.close();//2.排序ArrayList<Integer> list = new ArrayList<>();String[] arr = sb.toString().split("-");//分離-for (String s : arr) {//將數據轉為整數類型,為排序做準備list.add(Integer.parseInt(s));}Arrays.sort(arr);//排序//3.寫回FileWriter fw = new FileWriter("src\\b.txt");for (int i = 0; i < arr.length; i++) {if(i==arr.length-1) {fw.write(arr[i]+"");}else {fw.write(arr[i]+"-");}}fw.close();}
}

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

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

相關文章

汽車零部件開發應該具備哪些編程思維?

目錄 1、功能安全思維 2、實時性與確定性思維 3、可靠性和冗余思維 4、硬件軟件協同思維 5、CAN總線通信思維 6、故障診斷和自診斷思維 7、功耗優化思維 8、軟件更新和版本管理思維 9、用戶體驗與安全性思維 汽車零部件開發中&#xff0c;嵌入式軟件在車輛系統中的作用…

idea拉取合并后的分支

文章目錄 遠程拉取代碼.更新本地庫拉取后本地庫就有了合并后的代碼 遠程拉取代碼.更新本地庫 拉取后本地庫就有了合并后的代碼

1-18 GIT設置公鑰

1-1 GIT如何設置公鑰 1.0 注冊賬號 這個應該都是會的&#xff0c;就不做介紹了 2.0 設置公鑰 PWD的作用是查看文件的路徑 ssh-keygen -t ed25519 -C "Gitee SSH Key" 讀取公鑰文件&#xff1a; cat ~/.ssh/id_ed25519.pub 3.0 測試 查看綁定的用戶名和郵箱&#xff1…

【MySQL】 常見數據類型

MySQL常見數據類型 1.整數類型2.浮點數類型3.定點數類型4.bit類型5.字符串類型 5.1char和varchar類型5.2日期類型和時間類型5.3enum和set類型 1.整數類型 整數類型默認都是有符號整數 類型名稱 字節數 類型說明 tinyint 1 帶符號的范圍-128127&#xff0c;無符號范圍…

DeepSeek 部署中的常見問題及解決方案

DeepSeek 作為一款智能語義搜索框架&#xff0c;其本地化部署在實際操作中可能因環境配置、權限管理、硬件資源等因素遇到多種問題。本文結合當前市面上的實踐經驗&#xff0c;整合了部署中的常見問題及解決方案&#xff0c;幫助用戶高效排查和優化部署流程。 一、權限不足問題…

《機器學習數學基礎》補充資料:求解線性方程組的克拉默法則

《機器學習數學基礎》中并沒有將解線性方程組作為重點&#xff0c;只是在第2章2.4.2節做了比較完整的概述。這是因為&#xff0c;如果用程序求解線性方程組&#xff0c;相對于高等數學教材中強調的手工求解&#xff0c;要簡單得多了。 本文是關于線性方程組的拓展&#xff0c;供…

Jenkins介紹

什么是Jenkins Jenkins 是一個開源的自動化服務器&#xff0c;主要用于持續集成和持續交付&#xff08;CI/CD&#xff09;。它幫助開發團隊自動化構建、測試和部署軟件&#xff0c;從而提高開發效率和軟件質量。 如果一個系統是前后端分離的開發模式&#xff0c;在集成階段會需…

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解決辦法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解決辦法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 測試&#xff1a; python -c"import cv2"

【全棧】SprintBoot+vue3迷你商城-細節解析(2):分頁

【全棧】SprintBootvue3迷你商城-細節解析&#xff08;2&#xff09;&#xff1a;分頁 往期的文章都在這里啦&#xff0c;大家有興趣可以看一下 后端部分&#xff1a; 【全棧】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全棧】SprintBootvue3迷你商城&#xff08;…

kubeadm拉起的k8s集群證書過期的做法集群已奔潰也可以解決

kubeadm拉起的k8s集群證書過期的做法 這個是很久之前遇到的了&#xff0c;今天有空&#xff08;心血來潮&#xff09;就都回憶回憶寫在這里為愛發光&#xff0c;部分內容來自arch先生&#xff08;死黨&#xff09;的幫助。有時候有很多部門提了建k8s的需求&#xff0c;有些是臨…

Webpack 基礎入門

一、Webpack 是什么 Webpack 是一款現代 JavaScript 應用程序的靜態模塊打包工具。在 Web 開發中&#xff0c;我們的項目會包含各種類型的文件&#xff0c;如 JavaScript、CSS、圖片等。Webpack 可以將這些文件打包成一個或多個文件&#xff0c;以便在瀏覽器中高效加載。它就像…

torchsparse安裝過程的問題

1、項目要求torchsparse githttps://github.com/mit-han-lab/torchsparse.gitv1.4.0 2、torch1.8.1cu111 nvcc--version&#xff1a;11.1 這個版本的cuda匹配的gcc、g經常是7.5。設置為7.5. &#xff08;這個gcc、g版本修改不一定&#xff0c;可以先進行后面的&#xff0c…

嵌入式音視頻開發(二)ffmpeg音視頻同步

系列文章目錄 嵌入式音視頻開發&#xff08;零&#xff09;移植ffmpeg及推流測試 嵌入式音視頻開發&#xff08;一&#xff09;ffmpeg框架及內核解析 嵌入式音視頻開發&#xff08;二&#xff09;ffmpeg音視頻同步 嵌入式音視頻開發&#xff08;三&#xff09;直播協議及編碼器…

iOS App的啟動與優化

App的啟動流程 App啟動分為冷啟動和熱啟動 冷啟動&#xff1a;從0開始啟動App熱啟動&#xff1a;App已經在內存中&#xff0c;但是后臺還掛著&#xff0c;再次點擊圖標啟動App。 一般對App啟動的優化都是針對冷啟動。 App冷啟動可分為三個階段&#xff1a; dyld&#xff1a…

oppo,湯臣倍健,康冠科技25屆春招內推

oppo&#xff0c;湯臣倍健&#xff0c;康冠科技25屆春招內推 ①康冠科技25屆春招 【職位】算法、軟件、硬件、技術&#xff0c;結構設計&#xff0c;供應鏈&#xff0c;產品&#xff0c;職能&#xff0c;商務 【一鍵內推】https://sourl.cn/2Mm9Lk 【內推碼】EVBM88 ②湯臣倍健…

centos 9 時間同步服務

在 CentOS 9 中&#xff0c;默認的時間同步服務是 chrony&#xff0c;而不是傳統的 ntpd。 因此&#xff0c;建議使用 chrony 來配置和管理時間同步。 以下是使用 chrony 配置 NTP 服務的步驟&#xff1a; 1. 安裝 chrony 首先&#xff0c;確保系統已安裝 chrony。 在 CentOS…

解鎖 Python 導入系統:從基礎到進階的深度指南

本文全面解讀 Python 導入系統&#xff0c;從導入機制的基礎概念&#xff0c;如模塊、包的導入方式&#xff0c;到查找、加載模塊的詳細過程&#xff0c;再到導入系統的高級特性和應用場景&#xff0c;通過豐富示例、直觀圖表和對比分析&#xff0c;助你深入理解并熟練運用導入…

DDoS技術解析

這里是Themberfue 今天我們不聊別的&#xff0c;我們聊聊著名的網絡攻擊手段之一的 DDoS&#xff0c;看看其背后的技術細節。 DoS 了解 DDoS 前&#xff0c;先來講講 DoS 是什么&#xff0c;此 DoS 而不是 DOS 操作系統啊。1996年9月6日&#xff0c;世界第三古老的網絡服務提供…

docker安裝kafka,并通過springboot快速集成kafka

目錄 一、docker安裝和配置Kafka 1.拉取 Zookeeper 的 Docker 鏡像 2.運行 Zookeeper 容器 3.拉取 Kafka 的 Docker 鏡像 4.運行 Kafka 容器 5.下載 Kafdrop 6.運行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下載很慢&#x…

C++ 與 Java 的對比分析:除法運算中的錯誤處理

博客主頁&#xff1a; [小????????] 本文專欄: Java 文章目錄 &#x1f4af;前言&#x1f4af;C中的除法錯誤處理&#x1f4af;Java中的除法錯誤處理&#x1f4af;C與Java錯誤處理的對比&#x1f4af;錯誤處理的優化和實踐&#x1f4af;小結 &#x1f4af;前言 在…