欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现大文件的切割与合并操作示例

程序员文章站 2024-02-15 08:59:22
本文实例讲述了java实现大文件的切割与合并操作。分享给大家供大家参考,具体如下: 这里实现对大文件的切割与合并。 按指定个数切(如把一个文件切成10份)或按指定大小切...

本文实例讲述了java实现大文件的切割与合并操作。分享给大家供大家参考,具体如下:

这里实现对大文件的切割与合并。

按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10m),这两种方式都可以。

在这里我只是给大家写下我自己的一点简单的代码:

package io2;
import java.io.file;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.sequenceinputstream;
import java.util.arraylist;
import java.util.collections;
import java.util.enumeration;
import javax.swing.jfilechooser;
public class filesplitdemo {
/**
* 实现对大文件的切割与合并。 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10m),这两种方式都可以。
*/
public static void main(string[] args) {
jfilechooser jfc = new jfilechooser();// swing中的选择文件
// 选择文件
int result = jfc.showopendialog(null);// 显示框架用于选择文件
file file = null;// 要切割的文件
file dest = null;// 目的地文件
try {
if (result == jfilechooser.approve_option) {// 选中文件
// 切割文件
file = jfc.getselectedfile();// 用户选择的文件
dest = new file(file.getparent(), "splifile");
cutingfile(file, dest);// 切割方法
// 2合并(运行时,直接对刚才切割的那些文件碎片进行合并)
string filename = file.getname();
mergedemo(dest, filename);// 合并文件
}
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
private static void mergedemo(file dest, string filename)
throws ioexception {
// 健壮性防护(用file对象去开道)
if (!dest.exists()) {
throw new runtimeexception("文件不存在");
}
// 用一个文件数组将里面的文件都装起来
file parth[] = dest.listfiles();// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
if (parth.length == 0) {
throw new runtimeexception("碎片不存在");
}
// y用序列流来合并
arraylist<fileinputstream> list = new arraylist<fileinputstream>();
// for (int i = 0; i < parth.length; i++) {
// list.add(new fileinputstream(parth[i]));//不能这样,这样合并出来的文件是顺序乱的
// }
for (int i = 0; i < parth.length; i++) {
list.add(new fileinputstream(new file(dest, filename + (i + 1)
+ "part")));// 套接技术,文件加的顺序要和原文件一样
}
// 枚举对象接口
enumeration<fileinputstream> en = collections.enumeration(list);
sequenceinputstream sq = new sequenceinputstream(en);
// 写入到新文件中
fileoutputstream fou = new fileoutputstream(new file(dest, filename));
byte buf[] = new byte[1024];
sq.read(buf);
int len = 0;
while ((len = sq.read(buf)) > 0) {
fou.write(buf, 0, len);
}
fou.close();
sq.close();
}
private static void cutingfile(file source, file dest) {
// 切割
try {
fileinputstream fis = new fileinputstream(source);
if (!dest.exists()) {// 文件操作io流要判断文件是否存在。
dest.mkdir();
}
byte buf[] = new byte[1024 * 1024];// 1m
fis.read(buf);
int len = 0;
int cout = 1;
while ((len = fis.read(buf)) != -1) {
// 用out流来切割文件
fileoutputstream fout = new fileoutputstream(new file(dest,
source.getname() + (cout++) + "part"));
fout.write(buf, 0, len);
fout.close();
}
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
}

文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过1m。自己可把功能进一步扩展:切割前的文件名、长度,切割后的碎片个数、文件名等信息可写到第一个碎片中或另外用properties把这些写到配置文件中。

文件合并:这里简单假设已知被合并目录的file对象和原文件的名字。其实这些完全可以做成活的,如把这些信息保存在碎片文件或配置文件,也可以同样用文件选择对话框来读取用户的选择。

更多关于java算法相关内容感兴趣的读者可查看本站专题:《java文件与目录操作技巧汇总》、《java数据结构与算法教程》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。