思路:用字节流把文件拆分,然后用序列流合并字节流。
练习:文件切割与合并
实现对大文件的切割与合并。按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以。
示例程序说明:
1)文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过1M。自己可把功能进一步扩展:切割前的文件名、长度,切割后的碎片个数、文件名等信息可写到第一个碎片中或另外用properties把这些写到配置文件中。
2)文件合并:这里简单假设已知被合并目录的File对象和原文件的名字。其实这些完全可以做成活的,如把这些信息保存在碎片文件或配置文件,也可以同样用文件选择对话框来读取用户的选择。
代码实现:
package outIn2.fileCutAndMerge;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.Enumeration;
import java.util.Vector;
/*
* 1)学习切割文件
* 2)合并文件
*/
public class Test2 {
/*
* crossLine-切割线
*/
static int crossLine = 1024;
static String newFileName = "Tetris";
public static void main(String[] args) {
// test1();
test2();
}
/*
* 合并文件
*/
private static void test2() {
/*
* 先得到需要合并文件的数量,
* 然后合并。
*/
File f = new File("d:/ex/a/test1");
File[] files = null;
if (f.isDirectory()) {
files = f.listFiles();
}
String[] strs = new String[files.length];
for (int i = 0; i < strs.length; i++) {
strs[i] = files[i].getName();
}
BufferedInputStream[] bins = new BufferedInputStream[files.length];
Vector<BufferedInputStream> v = new Vector<BufferedInputStream>();
BufferedOutputStream bout = null;
try {
for (int i = 0; i < bins.length; i++) {
bins[i] = new BufferedInputStream(new FileInputStream(
"d:/ex/a/test1/" + strs[i]));
v.add(bins[i]);
}
Enumeration<BufferedInputStream> en = v.elements();
SequenceInputStream sin = new SequenceInputStream(en);
int len = 0;
byte[] buf = new byte[1024];
bout = new BufferedOutputStream(new FileOutputStream(
"d:/ex/a/test2/Tetris_Successful.zip"));
while ((len = sin.read(buf)) != -1) {
bout.write(buf, 0, len);
}
bout.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
for (int i = 0; i < bins.length; i++) {
if (bins != null) {
try {
bins[i].close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (bout != null) {
try {
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
* 拆分文件
*/
public static void test1() {
// FileInputStream fin = null;
// FileOutputStream fout = null;
BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try {
bin = new BufferedInputStream(new FileInputStream(
"d:/ex/a/Tetris0.zip"));
bout = new BufferedOutputStream(new FileOutputStream(
"d:/ex/a/test1/Tetris1.zip"));
/*
* 一次搬1KB的数据。
*/
int count = 0;
int len = 0;
int num = 2;
byte[] buf = new byte[1024];
while ((len = bin.read(buf)) != -1) {
/*
* 写入新文件
*/
bout.write(buf, 0, len);
count++;
if (count >= crossLine) {
bout.close();
bout = new BufferedOutputStream(new FileOutputStream(
"d:/ex/a/test1/Tetris" + num + ".zip"));
num++;
count = 0;
}
if (num >= 45) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bin != null) {
try {
bin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bout != null) {
try {
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
这个文件是myeclipse项目,有包名。