字节流和字符流的使用场景
字节流:拷贝任意类型的文件
字符流:读取纯文本文件的数据;往纯文本文件中写出数据
练习1:拷贝
需求:拷贝一个文件夹,考虑子文件夹
package a03test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
//1.创建对象表示数据源
File src=new File("E:\\JAVA\\24_3_31\\basic_code\\aaa");
//2.创建对象表示目的地
File dest=new File("E:\\JAVA\\24_3_31\\basic_code\\bbb");
//3.调用方法开始拷贝
copydir(src,dest);
}
private static void copydir(File src,File dest) throws IOException {
dest.mkdirs();
File[] files = src.listFiles();
for (File file : files) {
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();
}else{
copydir(file,new File(dest,file.getName()));
}
}
}
}
运行结果:
练习2:文件加密
为了保证文件的安全性,就需要对原始文件进行加密存储,在使用的时候再对其进行解密处理
加密原理:对原始文件中的每一个字节数据进行修改,然后将更改以后的数据存储到新的文件中
解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件
package a03test;
import java.io.*;
public class Test2 {
public static void main(String[] args) throws IOException {
//1.创建对象关联原始文件
//FileInputStream fis=new FileInputStream("E:\\JAVA\\24_3_31\\basic_code\\aaa\\小熊猫.jpg");//加密
FileInputStream fis=new FileInputStream("E:\\JAVA\\24_3_31\\basic_code\\bbb\\my.jpg");//解密
//2.创建对象关联加密文件
//FileOutputStream fos=new FileOutputStream("E:\\JAVA\\24_3_31\\basic_code\\bbb\\my.jpg");//加密
FileOutputStream fos=new FileOutputStream("E:\\JAVA\\24_3_31\\basic_code\\bbb\\myy.jpg");//解密
//3.加密处理
int b;
while((b=fis.read())!=-1){
fos.write(b^2);
}
fos.close();
fis.close();
}
}
加密用注释掉的代码,解密用上面的方法
运行结果:
练习3:修改文件中的数据
文本文件中有以下的数据:2-1-9-4-7-8
将文件中的数据进行排序,变成以下的数据:1-2-4-7-8-9
解法1:
package a03test;
import javax.xml.transform.Source;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class Test3 {
public static void main(String[] args) throws IOException {
//1.读取数据
FileReader fr=new FileReader("Test\\a.txt");
StringBuilder sb=new StringBuilder();
int ch;
while((ch=fr.read())!=-1){
sb.append((char)ch);
}
fr.close();
System.out.println(sb);
//2.排序
String str=sb.toString();
String[] arrstr = str.split("-");
ArrayList<Integer> list=new ArrayList<>();
for (String s : arrstr) {
int i = Integer.parseInt(s);
list.add(i);
}
Collections.sort(list);
System.out.println(list);
//3.写出
FileWriter fw=new FileWriter("Test\\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();
}
}
运行结果:
解法2:
package a03test;
import javax.xml.transform.Source;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function;
public class Test3 {
public static void main(String[] args) throws IOException {
//1.读取数据
FileReader fr=new FileReader("Test\\a.txt");
StringBuilder sb=new StringBuilder();
int ch;
while((ch=fr.read())!=-1){
sb.append((char)ch);
}
fr.close();
System.out.println(sb);
//2.排序
Integer[] arr = Arrays.stream(sb.toString().split("-"))
.map(Integer::parseInt)
.sorted()
.toArray(Integer[]::new);
//3.写出
FileWriter fw=new FileWriter("Test\\a.txt");
String s=Arrays.toString(arr).replace(", ","-");
String result = s.substring(1, s.length() - 1);
fw.write(result);
fw.close();
}
}
运行结果: