IO-文件的加密、断点续传、切割、递归拷贝等
IO流,这章内容大家都感觉内容多,杂,难。下面有几个作业题,你会几个?
1.大文件分割及还原合并
描述:有一个很大的文件需要拷贝,但是U盘只有1G,该怎么办?比如现有一个4G大的文件,需要分割成多个500M的文件,存在指定的文件夹中。
文件切割后,还需要还原合并出原来的文件。
2.任意多个不同类型不同大小文件的合并及拆分?
描述:选择一个指定的目录,下面包含多个不同的文件,实现文件合并成一个文件。 并再实现文件拆分还原为原来文件。
注意:文件中要包含文件名及大小的信息,因为拆分时需要还原为原来的文件名及大小
3.文件断点续传
描述:在QQ中我们在传输文件时,偶尔会碰到网络不稳定而导致传输中断的情况,到那时QQ再次上线时,只要你选择相同文件传输,可以接续上次的文件继续接收。
4.代码量统计器
描述:使用文件选择器,选择一个文件夹,确定后能统计出此文件下及子文件夹下所有的 .java 的总行数。
5.如何使用文件序列化实现对象的深克隆?
描述:序列化是编程中很重要的概念,就是把对象状态转为可存储或可传输的状态的过程。对象克隆就是实现对象的拷贝,产生一个新对象并包含和被克隆对象相同的属性值
6.如何实现文件的加密和解密?
描述:现有部分文件属于私有秘密文件,编写程序实现文件不能正常打开使用。只有通过解密后才能还原出原有的文件,才能正常打开使用。
7.文件夹递归删除
描述:指定一个文件夹,通过程序递归删除文件夹下所有文件及子文件夹下的文件。
8.文件夹的递归拷贝
描述:指定源文件夹及目标文件夹,实现源文件夹下所有文件及子文件夹复制到目标文件夹下,并保持原有的文件结构不变。
1.大文件分割及还原合并
描述:
有一个很大的文件需要拷贝,但是U盘只有1G,该怎么办?比如现有一个4G大的文件,需要分割成多个500M的文件,存在指定的文件夹中。
文件切割后,还需要还原合并出原来的文件。
package com.wdzl.demo01;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件切割和合并还原
*
*/
public class Homework1 {
public static void main(String[] args) {
split();
// merge();
System.out.println("完成");
}
/**
* 100M文件
* 分割第一种思路:
* 正常文件拷贝,读取字节时累计总字节数,统计已读取字节数是否超出设定的大小,超出则换新文件输出流
*/
public static void split() {
final int MAX = 100*1024*1024;
String src = "d:/tools/eclipse-jee-2018-12-R-win32-x86_64_includeJDK.zip";
String dest = "d:/111";
try(InputStream is = new FileInputStream(src)) {
FileOutputStream out = null;
byte[] b = new byte[2048];
int len = 0;
//
int total = 0;//累计已经读取的字节数
int count = 0;
while((len=is.read(b))!=-1) {
if(count==0) {
count++;
out = new FileOutputStream(dest+"/"+count+".data");
}
total += len;
if(total>MAX) {
count++;
out.close();
out = new FileOutputStream(dest+"/"+count+".data");
total = 0;///重新开始
System.out.println(">>>>==="+count);
}
out.write(b, 0, len);
out.flush();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 第二种思路:
* 根据源文件大小及切割的大小直接计算出需要分割成的总文件数。
* 然后每次一次性写出一个小文件
*/
public static void split2() {
final int MAX = 100*1024*1024;
String src = "d:/tools/eclipse-jee-2018-12-R-win32-x86_64_includeJDK.zip";
String dest = "d:/111";
try(InputStream is = new FileInputStream(src)) {
//输入流可用字节数
int fileSize = is.available();
//计算分割文件个数
int count = fileSize%MAX==0?fileSize/MAX:fileSize/MAX+1;
byte[] b = new byte[MAX];
for (int i = 0; i < count; i++) {
OutputStream out = new FileOutputStream(dest+"/"+(i+1)+".data");
int len = is.read(b);
out.write(b,0,len);
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件合并:多个输入流,一个输出流
*/
public static void merge() {
String srcDir = "d:/111";
String dest = "d:/x.zip";
try(OutputStream out = new FileOutputStream(dest)){
File dir = new File(srcDir);
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
String name = pathname.getName();
return name.endsWith(".data");
}
});
for (int i = 0; i < files.length; i++) {
InputStream is = new FileInputStream(files[i]);
//
byte[] b = new byte[1024];
int len = 0;
while((len=is.read(b))!=-1) {
out.write(b, 0, len);
}
is.close();
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
2.任意多个不同类型不同大小文件的合并及拆分?
描述:
选择一个指定的目录,下面包含多个不同的文件,实现文件合并成一个文件。 并再实现文件拆分还原为原来文件。
注意:文件中要包含文件名及大小的信息,因为拆