1.文件上传 并进行分割保存进缓冲区。
private static void splitFile(String sourceFilePath, String splitFolder, int numSplits) throws IOException {
File sourceFile = new File(sourceFilePath);
//获取源文件的大小
long fileSize = sourceFile.length();
//计算每个分割文件的大小
long splitSize = fileSize / numSplits;
//打开源文件输出流 使用 try with resources 自动关闭输入流
try (InputStream inputStream = new FileInputStream(sourceFile)) {
//创建用于缓存的数组
byte[] buffer = new byte[1024];
//根据定义的分割数量进行分割文件
for (int i = 0; i < numSplits; i++) {
//拼接分割文件的名字
String splitFileName = splitFolder + "/split" + i + ".part";
//打开文件输出流 使用try with resources 自动关闭输出流
try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(splitFileName))) {
//定义变量,记录每次读取的字节数
int bytesRead;
//记录当前分割文件中已经写入的字节数
long bytesWritten = 0;
//循环读取源文件中的数据。知道读满一个分割文件的大小或文件末尾
while (bytesWritten < splitSize && (bytesRead = inputStream.read(buffer)) != -1) {
//将读取的数据写入分割文件中。并更新计数器
outputStream.write(buffer, 0, bytesRead);
bytesWritten += bytesRead;
}
}
}
}
}
2.合并文件
public static void mergeFiles(String splitFolder, String mergedFilePath, int numSplits) throws IOException {
//创建合并后的文件对象
File mergeFile = new File(mergedFilePath);
//如果合并后的文件不存在,则创建文件
if (!mergeFile.exists()) {
mergeFile.createNewFile();
}
//打开文件输出流,使用buffered writer缓冲写入数据
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(mergeFile), "UTF-8"));
//循环读取指定数量的分割文件。并将其内容写入到合并后的文件中
for (int i = 0; i < numSplits; i++) {
String splitFileName = splitFolder + "/split" + i + ".part";
File splitFile = new File(splitFileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(splitFile), "UTF-8"));
//定义字符数组和读取字节数变量
char[] chars = new char[1024];
int bytesRead;
while ((bytesRead = reader.read(chars)) != -1) {
writer.write(chars, 0, bytesRead);
}
//关闭分割文件输入流,删除分割文件
reader.close();
splitFile.delete();
}
writer.close();
}
3.计算文件的MD5值
static String calculateMD5(String filePath) throws NoSuchAlgorithmException, IOException {
//创建一个对象,指定使用md5算法 抛出异常
MessageDigest md5 = MessageDigest.getInstance("MD5");
//打开计算MD5值的文件输入流 抛出异常
FileInputStream inputStream = new FileInputStream(filePath);
//创建一个byte数组的缓冲区。
byte[] bytes = new byte[65536];
int read;
//循环读取文件中的数据,并将其更新到MD5中。
while ((read = inputStream.read(bytes)) != -1){
md5.update(bytes,0,read);
}
//获取MD5的值
byte[] digest = md5.digest();
//将byte数组形式的MD5值转换为16进制字符串。
StringBuilder builder = new StringBuilder();
for (byte b : digest) {
builder.append(String.format("%02x",b));
}
//返回十六进制的字符串
return builder.toString();
}
4.再次定义比较MD5的方法
比较两个文件的MD5值是否相同
private static boolean compareFiles(String file1,String file2) throws NoSuchAlgorithmException, IOException {
//分别计算两个文件的MD5
String s = calculateMD5(file1);
String s1 = calculateMD5(file2);
//判断两个文件的值,使用equals比较
return s.equals(s1);
}
最后,在main方法中
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
//定义需要的变量
String sourceFilePath = "D:\\files/每日进度.txt"; // 原始文件路径
String splitFolder = "D:\\files"; // 拆分文件存储的文件夹路径
String mergedFilePath = "D:\\files/进度测试.txt"; // 合并后文件的路径
int numSplits = 10; // 拆分文件的数量
//调用拆分方法 传入参数, 抛出异常
splitFile(sourceFilePath,splitFolder,numSplits);
//调用合并方法
mergeFiles(splitFolder,mergedFilePath,numSplits);
//调用方法,这判断文件是否相同
boolean b = compareFiles(sourceFilePath, mergedFilePath);
//将比较的结果输出到控制台
if(b){
System.out.println("比较相同,导入失败");
}else {
System.out.println("比较不同,导入成功");
}
}
调用方法。添加变量