字符流練習
- 練習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 輸出結果
- 原來的文件數據
- 現在的文件數據