写点什么

Java 实现文件切割拼接,MongoDB 数据分布不均的解决方案

用户头像
极客good
关注
发布于: 刚刚

将路径转换为文件对象,再计算将分割多少块:


File file = filePath.toFile();


int howManyParts = (int) Math.ceil(file.length() / (double)filePieceSize);


初始化输入输出流,出错输出错误信息,返回 false,获得当前目录:


DataInputStream fileReader = null;


try {


fileReader = new DataInputStream(new FileInputStream(file));


} catch (FileNotFoundException e) {


e.printStackTrace();


System.out.println("文件找不到!");


return false;


}


DataOutputStream fileWriter;


Path dir = filePath.getParent();


接下来读取文件,并且分别输出到各个 part 文件中:


int readLength = -1;


long total = 0;


try {


for (int i = 1; i <= howManyParts ; i++){


//新建文件 part i


Path temp = Files.createFile(dir.resolve(filePath.getFileName() + ".part" + i));


//搭建输出流


fileWriter = new DataOutputStream(new FileOutputStream(temp.toFile()));


//读取文件并输出


while ( (readLength = fileReader.read(buffer)) != -1){


fileWriter.write(buffer,0,readLength);


fileWriter.flush();


total += readLength;


if (total == filePieceSize){


total = 0;


break;


}


}


//part i 的文件已经输出完毕,关闭流


fileWriter.close();


}


//读取完毕,关闭输入流


fil


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


eReader.close();


} catch (IOException e) {


e.printStackTrace();


System.out.println("IO 错误!");


return false;


}


该函数已经实现完毕,接下来测试(由于电影 Fury 有 14G。。太大了。。还是换个吧):



我是大哥大第 5 集,有 729M,大概能分个 12 个 part 吧。


public static void main(String[] args) throws IOException {


double before = System.currentTimeMillis();


Path bigboss = Paths.get("D:\Video\我是大哥大\我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4");


FileSlice.slice(bigboss,-1);


double after = System.currentTimeMillis();


System.out.println("分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4," + Files.size(bigboss) + "字节,总用时" + (after - before) + "ms" );


}


运行结果:


分割文件我是大哥大.Kyou.kara.Ore.wa.Ep05.Chi_Jap.HDTVrip.1280X720.mp4,765321889 字节,总用时 16335.0ms



速度还是挺慢的。。 下次还是换成多线程来实现,再来测试下速度。在单线程情况下一个普通的 40 分钟日剧都要 15-30s 左右,要是 mkv 格式的电影都要好久了。。不过其实极限应该不在 CPU 中执行的速度,而是在硬盘 IO 中,如果是普通硬盘那么就算是多线程也应该提速不了多少。。

文件拼接

这个就很简单了,和分割相反就 OK。 直接上完整代码:


public static boolean glue(Path filePath, int howManyParts){


if (!Files.exists(filePath)){


return false;


}


//获取原始文件名


String filename = getOriginalFileName(filePath.getFileName().toString());


if (filename == null){


System.out.println("传入 part 文件名解析出错!");


return false;


}


//初始化缓冲区


byte [] buffer = new byte[1024 * 8];


//获取文件存储的路径


Path dir = filePath.getParent();


try {


DataInputStream fileReader = null;


//创建原始文件


Files.createFile(dir.resolve(filename));


//搭建原始文件输出流


DataOutputStream fileWriter = new DataOutputStream(new FileOutputStream(dir.resolve(filename).toFile()));


int readLength = -1;


for (int i = 1; i <= howManyParts ; i++){


//得到 part i 文件路径


Path temp = dir.resolve(filename + ".part" + i);


//搭建输入流


fileReader = new DataInputStream(new FileInputStream(temp.toFile()));


//读取文件并输出


while ( (readLength = fileReader.read(buffer)) != -1){


fileWriter.write(buffer,0,readLength);


fileWriter.flush();


}


//part i 的文件已经读入完毕,关闭流


fileReader.close();


}


//写入完毕,关闭输出流


fileWriter.close();


} catch (IOException e) {


e.printStackTrace();


System.out.println("IO 错误!");


return false;


}


return true;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Java实现文件切割拼接,MongoDB数据分布不均的解决方案