先来说说字节流和字符流的应用场景
练习一:
/*
拷贝一个文件夹考虑子文件夹
*/
//源文件夹路径
File src = new File("E:\\aaa-FIle学习测试\\bbb");
//目的文件夹路径
File dest= new File("E:\\aaa-FIle学习测试\\ccc");
copy(src,dest);
}
public static void copy(File src,File dest) throws IOException {
//若说目的文件夹不存在,则创建。
dest.mkdirs();
//进入源文件夹
File[] files = src.listFiles();
//增强for遍历获取其文件和子文件夹
for (File file : files) {
//判断文件
if (file .isFile()){
//是文件就直接拷贝,拷贝文件使用字节流
//创建FileInputStream对象,并关联源文件
FileInputStream fis=new FileInputStream(file);//"E:\\aaa-FIle学习测试\\bbb\\...txt"
//创建FileOutputStream对象,并关联目的文件 //file.getName()指文件名,并和目的文件夹拼接
FileOutputStream fos=new FileOutputStream(new File(dest,file.getName()));//得到"E:\\aaa-FIle学习测试\\ccc\\...txt"
//读取数据
byte[]bytes=new byte[1024*1024*5];
int len;
while((len= fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}else{
//判断子文件夹,递归 //file.getName()指文件夹名,并和目的文件夹拼接
copy(file,new File(dest,file.getName()));//第二个参数:"E:\\aaa-FIle学习测试\\ccc\\..."
}
}
练习二:
先了解一个知识:一个数和另一个数异或运算两次会还原
如:
相同是false(0),相异是true(1)
加密操作
//字节流输入流并关联文件
FileInputStream fis=new FileInputStream("..\\ioDemo\\a.txt");
//字节输出流
FileOutputStream fos=new FileOutputStream("..\\ioDemo\\b.txt");
int i;
while((i= fis.read())!=-1){
//异或加密
fos.write(i^10);
}
fos.close();
fis.close();
成功加密
解密:
public class Test03 {
public static void main(String[] args) throws IOException {
//字节输入流
FileInputStream fis=new FileInputStream("..\\ioDemo\\b.txt");
//字节输出流
FileOutputStream fos=new FileOutputStream("..\\ioDemo\\c.txt");
int i;
while((i=fis.read())!=-1){
fos.write(i^10);
};
}
}
成功解密
练习三:
先写入数据
//写入
FileOutputStream fos=new FileOutputStream("..\\ioDemo\\d.txt");
String str="2-1-9-4-7-8";
byte[] bytes = str.getBytes();
fos.write(bytes);
fos.close();
再提取数据,把数字部分拿出来
//读取
FileReader fr = new FileReader("..\\ioDemo\\d.txt");
//定义集合放数字
ArrayList<Integer> list = new ArrayList<>();
int b;//当前获取到的ascii值
int i = 1;//用来记录当前获取的位置
while ((b = fr.read()) != -1) {
//发现规律:分布在奇数的位置1、3、5、7、9
if (i % 2 != 0) {
System.out.println((char) b);
list.add(Character.getNumericValue((char) b));//调用方法变成int类型放入集合,其实这里转为int无意义,
//因为放入还是放的字符
}
i++;
}
System.out.println(list);//[2, 1, 9, 4, 7, 8]
//使用stream流:升序排序
List<Integer> sorted = list.stream().sorted().collect(Collectors.toList());
System.out.println(sorted);//[1, 2, 4, 7, 8, 9]
//输出
FileWriter fw = new FileWriter("..\\ioDemo\\d.txt");
//遍历写入
for (int j = 0; j < sorted.size(); j++) {
if (j < sorted.size() - 1) {
fw.write(sorted.get(j) + "-");
} else {
//如果是输出最后一个就不要“-”
fw.write(sorted.get(j) + "");
}
}
//关流
fw.close();
fr.close();