文件切割
Java的文件切割实质上是利用的IO对文件进行读和写,原理很简单,只要熟练运用IO即可。
一、按大小切:
package cn.hncu.io.fileSplit;
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.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import javax.swing.JFileChooser;
public class FileSplit1 {
/**
* @param args
*/
public static void main(String[] args) {
JFileChooser jfc=new JFileChooser();
File file=null;
File dir=null;
int result=jfc.showOpenDialog(null);
if (result==jfc.APPROVE_OPTION){
file=jfc.getSelectedFile();
dir=new File(file.getParent(),"splitedFiles");
try {
fileSplit(file,dir);//切割
String fileName=file.getName();
fileMerge(fileName,dir);//合并
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void fileMerge(String fileName, File dir) throws IOException {
if (!dir.exists()){
throw new RuntimeException(dir.getName()+" do not exists");
}
File partFiles[]=dir.listFiles();
if (partFiles.length==0){
throw new RuntimeException(dir.getName()+" has not files");
}
BufferedInputStream bis=null;
ArrayList<BufferedInputStream> list=new ArrayList<BufferedInputStream>();
for (int i=0;i<partFiles.length;i++){
bis = new BufferedInputStream(new FileInputStream(dir.getName()+"\\"+partFiles[i].getName()));
list.add(bis);
}
Enumeration<BufferedInputStream> en=Collections.enumeration(list);
SequenceInputStream sis=new SequenceInputStream(en);
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(dir.getName()+"\\"+fileName));
int len=0;
byte buf[]=new byte[10240];
while ((len=sis.read(buf))!=-1){
bos.write(buf,0,len);
}
bos.close();
bis.close();
sis.close();
}
private static void fileSplit(File file, File dir) throws IOException {
if (!dir.exists()){
dir.mkdirs();
}
InputStream in=new BufferedInputStream(new FileInputStream(file));
OutputStream out=null;
byte[] buf=new byte[10240];
int len=0;
int index=1;
int endIndex=file.getName().indexOf(".");
String fileName=file.getName().substring(0, endIndex);
while ((len=in.read(buf))!=-1){
out=new BufferedOutputStream(new FileOutputStream(dir.getName()+"\\"+fileName+(index++)+".part"));
out.write(buf, 0, len);
}
out.close();
in.close();
}
}
二、按数量切:
package cn.hncu.io.fileSplit;
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.InputStream;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
public class FileSplitByQuantity {
/**
* @param args
*/
public static void main(String[] args) {
int quantity=10;//要切成的数量
JFileChooser jfc=new JFileChooser();
int result=jfc.showOpenDialog(null);
File file=null;
File dir=null;
if (result==jfc.APPROVE_OPTION){
file=jfc.getSelectedFile();
dir=new File(file.getParent(),"splitedByQuantity");
try {
fileSplit(file,dir,quantity);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void fileSplit(File file, File dir, int quantity) throws IOException {
if (!dir.exists()){
dir.mkdirs();
}
FileInputStream fis=new FileInputStream(file);
InputStream in=new BufferedInputStream(fis);
long length=file.length();
int l=(int)(length/quantity+1);
byte buf[]=new byte[l];
int len=0;
FileOutputStream fos=null;
//定新文件名前缀
int index=1;
int endIndex=file.getName().indexOf(".");
String fileName=file.getName().substring(0, endIndex);
while ((len=in.read(buf))!=-1){
fos=new FileOutputStream(new File(dir, fileName+(index++)+".part"));
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(buf, 0, len);
bos.close();
fos.close();
}
fis.close();
in.close();
}
}
注意:对于输出流,如果加了缓冲流要先关缓冲流再关字节流或其他流;对于输入流,若加了缓冲流则先关字节流或其他再关缓冲流。