【IO流系列】字符流練習(拷貝、文件加密、修改文件數據)

字符流練習

    • 練習1:文件夾拷貝
      • 1.1 需求
      • 1.2 代碼實現
      • 1.3 輸出結果
    • 練習2:文件加密與解密
      • 2.1 需求
      • 2.2 代碼實現
      • 2.3 輸出結果
    • 練習3:修改文件數據(常規方法)
      • 3.1 需求
      • 3.2 代碼實現
      • 3.3 輸出結果
    • 練習4:修改文件數據(省略方法)
      • 4.1 需求
      • 4.2 代碼實現
      • 4.3 輸出結果

練習1:文件夾拷貝

1.1 需求

需求:拷貝一個文件夾,考慮子文件夾

  • 拷貝的文件夾:D:\QQ
  • 拷貝的位置:D:\File

1.2 代碼實現

package text.IOStream.FileWrite.FileWrite02;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*拷貝
需求:拷貝一個文件夾,考慮子文件夾拷貝的文件夾:D:\QQ
拷貝的位置:D:\File*/
public class FileWrite02 {public static void main(String[] args) throws IOException {//創建數據源File startFile = new File("D:\\QQ");//創建目的地File endFile = new File("D:\\File");copy(startFile, endFile);}/** 作用:拷貝文件夾* 參數一:數據源* 參數二:目的地* */private static void copy(File startFile, File endFile) throws IOException {//先創建目的地文件(當目的地文件存在時,則創建失敗)endFile.mkdir();//進入文件夾File[] files = startFile.listFiles();//遍歷數組for (File file : files) {//判斷該file是文件還是文件夾if (file.isFile()) {//如果是文件,則拷貝(拷貝用字節流)//創建字節輸入流對象FileInputStream fis = new FileInputStream(startFile);//創建字節輸出流對象//new File(endFile, startFile.getName())指得是新創建個文件對象//參數一:指要拷貝的目的地的文件//參數二:指要拷貝目的地文件的名字FileOutputStream fos = new FileOutputStream(new File(endFile, startFile.getName()));//創建了個字節數組,加快拷貝效率byte[] bytes = new byte[1024 * 1024 * 5];int b;//定義一個變量記錄每次讀取的數據的個數while ((b = fis.read()) != -1) {fos.write(bytes, 0, b);}//釋放資源(先開的流后關)fos.close();fis.close();} else {//如果是文件夾,則遞歸copy(startFile, new File(endFile, startFile.getName()));}}}
}

1.3 輸出結果

在這里插入圖片描述

練習2:文件加密與解密

2.1 需求

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

  • 加密原理:
    對原始文件中的每一個字節數據進行更改,然后將更改以后的數據存儲到新的文件中。
  • 解密原理:
    讀取加密之后的文件,按照加密的規則反向操作,變成原始文件。

^ : 異或
兩邊相同:false
兩邊不同:true

       0:false1:true100:110010010: 1010100與10異或:1100100^    1010__________1101110110與10異或:1101110^    1010__________1100100

2.2 代碼實現


package text.IOStream.FileWrite.FileWrite03;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*文件加密
為了保證文件的安全性,就需要對原始文件進行加密存儲,再使用的時候再對其進行解密處理。
加密原理:對原始文件中的每一個字節數據進行更改,然后將更改以后的數據存儲到新的文件中。
解密原理:讀取加密之后的文件,按照加密的規則反向操作,變成原始文件。^ : 異或兩邊相同:false兩邊不同:true0:false1:true100:110010010: 1010100與10異或:1100100^    1010__________1101110110與10異或:1101110^    1010__________1100100*/
public class FileWrite03 {public static void main(String[] args) throws IOException {//創建對象并關聯原始文件FileInputStream fis1 = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\a.txt");//創建對象并關聯加密文件FileOutputStream fos1 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\b.txt");//創建對象并關聯加密文件FileInputStream fis2 = new FileInputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\b.txt");//創建對象并關聯解密文件FileOutputStream fos2 = new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite03\\c.txt");//加密ency(fis1, fos1);//解密redu(fis2, fos2);}//解密private static void redu(FileInputStream fis1, FileOutputStream fos2) throws IOException {int b;while ((b = fis1.read()) != -1) {fos2.write(b ^ 10);}//釋放資源fos2.close();fis1.close();}//加密private static void ency(FileInputStream fis, FileOutputStream fos) throws IOException {int b;while ((b = fis.read()) != -1) {fos.write(b ^ 10);}//釋放資源fos.close();fis.close();}
}

2.3 輸出結果

  • 原來的文件:a.txt
    在這里插入圖片描述
  • 加密后的文件:b.txt
    在這里插入圖片描述
  • 解密后的文件:c.txt
    在這里插入圖片描述

練習3:修改文件數據(常規方法)

3.1 需求

需求:

  • 文本文件中有的數據:

    2-1-9-4-7-8

  • 將文件中的數據進行排序,變成以下的數據;

    1-2-4-7-8-9

細節1:文件中的數據不要換行
細節2:文件可能有隱藏的bom頭

3.2 代碼實現

package text.IOStream.FileWrite.FileWrite04;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;/*修改文件中的數據
需求:文本文件中有的數據:2-1-9-4-7-8將文件中的數據進行排序,變成以下的數據;1-2-4-7-8-9細節1:文件中的數據不要換行
細節2:文件可能有隱藏的bom頭*/
public class FileWrite04 {public static void main(String[] args) throws IOException {//創建對象FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite04\\a.txt");//排序//創建StringBuilder對象用于存儲數據StringBuilder sb = new StringBuilder();//創建變量記錄讀取的數據個數int b;while ((b = fr.read()) != -1) {sb.append((char) b);}fr.close();//將StringBuilder里的數據轉換成字符串,方便截取String str = sb.toString();//截取字符串String[] split = str.split("-");//創建集合用于存儲數字ArrayList<Integer> list = new ArrayList<>();//遍歷數組,將數字存入集合for (String s : split) {int num = Integer.parseInt(s);list.add(num);}//排序集合里的數字Collections.sort(list);//寫出FileWriter fw = new FileWriter("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite04\\a.txt");//遍歷集合for (int i = 0; i < list.size(); i++) {if (i == list.size() - 1) {fw.write(list.get(i) + "");//加""的原因是防止寫入字符對應的數字} else {fw.write(list.get(i) + "-");}}fw.close();}
}

3.3 輸出結果

  • 原來文件數據
    在這里插入圖片描述

  • 現在文件數據
    在這里插入圖片描述

練習4:修改文件數據(省略方法)

4.1 需求

需求:

  • 文本文件中有的數據:

    2-1-9-4-7-8

  • 將文件中的數據進行排序,變成以下的數據;

    1-2-4-7-8-9

細節1:文件中的數據不要換行
細節2:文件可能有隱藏的bom頭

4.2 代碼實現

package text.IOStream.FileWrite.FileWrite05;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.function.Function;/*修改文件中的數據
需求:
文本文件中有的數據:
2-1-9-4-7-8
將文件中的數據進行排序,變成以下的數據;
1-2-4-7-8-9細節1:文件中的數據不要換行
細節2:文件可能有隱藏的bom頭
*/
public class FileWrite05 {public static void main(String[] args) throws IOException {//創建對象FileReader fr = new FileReader("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite05\\a.txt");//創建StringBuilder對象用于存儲數據StringBuilder sb = new StringBuilder();//創建變量記錄讀取的數據個數int b;while ((b = fr.read()) != -1) {sb.append((char) b);}fr.close();//排序Integer[] array = Arrays.stream(sb.toString().split("-"))//Stream流將StringBuilder里的數據轉換成字符串并分割字符串.map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}})//格式轉換.sorted()//排序.toArray(Integer[]::new);//利用方法引用轉換成數組//寫出FileWriter fw = new FileWriter("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\FileWrite\\FileWrite05\\a.txt");String replace = Arrays.toString(array).replace(", ", "-");//將排序后的數組中的 , 替換成 -String substring = replace.substring(1, replace.length() - 1); //截取字符串(截取第二個到倒數第二個)fw.write(substring);//寫入數據fw.close();}
}

4.3 輸出結果

  • 原來的文件數據
    在這里插入圖片描述
  • 現在的文件數據
    在這里插入圖片描述

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

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

相關文章

day14:棧排序

問題描述&#xff1a; 棧排序。 編寫程序&#xff0c;對棧進行排序使最小元素位于棧頂。最多只能使用一個其他的臨時棧存放數據&#xff0c;但不得將元素復制到別的數據結構&#xff08;如數組&#xff09;中。該棧支持如下操作&#xff1a;push、pop、peek 和 isEmpty。當棧…

【MySQL】查詢語句:條件、排序和分頁

基本查詢 MySQL 數據庫使用SELECT語句來查詢數據。 查詢字段 以下為在MySQL數據庫中查詢數據通用的 SELECT 語法&#xff1a; SELECT 字段名,字段名... FROM 表名;選擇全部列 SELECT * FROM emp; -- 查詢所有字段一般情況下&#xff0c;除非需要使用表中所有的字段數據&…

消防主機報故障時發出故障及原因及解決辦法!

本文以青鳥消防JBF-11SF為例。 其他型號或品牌的消防主機也可參考。 開機前&#xff0c;必須先測量系統接線的絕緣電阻&#xff0c;確保各絕緣電阻滿足以下要求&#xff1a; 1&#xff09;空載時各電路信號線之間的絕緣值應大于5K歐姆。 2&#xff09;正常天氣條件下&#x…

Java SE:反射

反射作用 獲取字節碼文件里面的所有信息&#xff0c;包括構造方法、成員、成員方法&#xff0c;以及修飾他們的修飾符、類型和方法的返回值等等&#xff0c;只要是類里面的內容都能獲取&#xff0c;獲取之后可以動態的調用方法&#xff0c;動態的創建對象 獲取類字節碼文件對象…

2024全國水科技大會暨新材料在水污染防治中的應用論壇(十)

召集人&#xff1a;唐 量 上海大學環境與化學工程學院教授 莊贊勇 福州大學材料科學與工程學院教授 一、會議背景 為積極應對“十四五”期間我國生態環境治理面臨的挑戰&#xff0c;加快生態環境科技創新&#xff0c;構建綠色技術創新體系&#xff0c;全面落實科學技術部、生…

創建hadoop集群

分布式hadoop集群分布 服務器功能規劃 node-1&#xff1a;namenode,datanode,nodemanager,historyserver node-2&#xff1a;resourcemanage,datanode,nodemanager node-3&#xff1a;datanode&#xff0c;nodemanager&#xff0c;secondarynamenode #在node-1上 $ bin/hdfs …

點云數據結構化與體素化理論學習

一、PCD點云數據存儲格式的進一步認識 &#xff08;一&#xff09;PCD點云存儲格式相較于其它存儲格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的優勢[1] &#xff08;1&#xff09;具有存儲和處理有組織的點云數據集的能力&#xff0c;這對于實時應用和增強現實及機器…

20240302-1-ZooKeeper面試題(三)

21. 集群最少要幾臺機器&#xff0c;集群規則是怎樣的? 集群規則為 2N1 臺&#xff0c;N>0&#xff0c;即 3 臺。 22. 集群支持動態添加機器嗎&#xff1f; 其實就是水平擴容了&#xff0c;Zookeeper 在這方面不太好。兩種方式&#xff1a;第 62 頁 共 485 頁全部重啟&a…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之非包裝類型

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之非包裝類型 一、未包裝類型映射二、未包裝類型字段名三、查詢未包裝對象3.1 按未包裝字段排序3.2 未包裝對象的字段投影3.3 未包裝對象的Query By Example3.4 未包裝對象的存儲庫查詢 四、更新未包裝對象五、未包裝對象…

蒼穹外賣學習 Day10 Day11 Day12

前言 用于記錄蒼穹外賣Day10、Day11、Day12的學習 Day10 訂單狀態定時處理 來電提醒 客戶催單 訂單狀態定時處理 Spring Task Spring Task是一個任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯&#xff08;定時自動執行某段Java代碼&#xff09; cron表…

代碼隨想錄算法訓練營第三十天| 回溯篇總結

文章目錄 前言一、組合問題二、切割問題三、子集問題四、排列問題五、性能分析總結 前言 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 組合問題&#xff1a;N個數里面按一定規則找出k個數的集合 排列問題&#xff1a;N個數按一定規則全…

【黑馬程序員】STL之set和map容器

文章目錄 set/multiset容器set基本概念簡介區別 set的構造和賦值功能描述函數原型代碼示例運行結果 set的大小和交換功能描述函數原型代碼示例運行結果 set的插入和刪除功能描述函數原型代碼示例運行結果 set查找和統計函數原型代碼示例運行結果 set和multiset區別區別代碼示例…

JVM(6)

JMM JVM定義了一種Java內存模型來屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平臺下都能達到一致的內存訪問效果.在此之前,C/C直接使用物理硬件和操作系統的內存模型,因此,會由于不同平臺下的內存模型差異,有可能導致程序在一套平臺上并發完全正常,而在另…

深入解剖指針(4)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a; 我要學編程(?_?)-CSDN博客 目錄 回調函數 qsort使用舉例 使用qsort函數排序整型數據 使用qsort排序結構數據 qsort函數的模擬實現 回調函數 回調函數就是一個通過函數指…

【Android12】Android性能調優工具SystemServerTiming日志

Android性能調優工具SystemServerTiming日志 性能優化、穩定性優化是Android系統優化的兩大方面&#xff0c;對于性能調試Android提供了很多工具&#xff0c;比如&#xff1a;bootchart、systrace、perfboot、log、dmsg等等。 SystemServerTiming是Android原生系統中一個日志…

《Spring Security 簡易速速上手小冊》第10章 未來趨勢與高級話題(2024 最新版)

文章目錄 10.1 云原生安全性趨勢10.1.1 基礎知識10.1.2 重點案例&#xff1a;保護微服務通信10.1.3 拓展案例 1&#xff1a;容器安全最佳實踐10.1.4 拓展案例 2&#xff1a;自動化安全審計和合規性檢查 10.2 反應式編程與 Spring Security10.2.1 基礎知識10.2.2 重點案例&#…

nginx-圖片模塊

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 訪問: 1234…

CSS錐形漸變:conic-gradient()

畫一個扇形圖&#xff0c;使用常規方法可能很難畫&#xff0c;但是用錐形漸變的話非常好畫 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

Git分布式版本控制系統——git學習準備工作

一、Git倉庫介紹 開發者可以通過Git倉庫來存儲和管理文件代碼&#xff0c;Git倉庫分為兩種&#xff1a; 本地倉庫&#xff1a;開發人員自己電腦上的Git倉庫 遠程倉庫&#xff1a;遠程服務器上的Git倉庫 倉庫之間的運轉如下圖&#xff1a; commit&#xff1a;提交&#xff…

Decoupled Knowledge Distillation解耦知識蒸餾

Decoupled Knowledge Distillation解耦知識蒸餾 現有的蒸餾方法主要是基于從中間層提取深層特征&#xff0c;而忽略了Logit蒸餾的重要性。為了給logit蒸餾研究提供一個新的視角&#xff0c;我們將經典的KD損失重新表述為兩部分&#xff0c;即目標類知識蒸餾&#xff08;TCKD&a…