您的位置:首页 > 其它

文件切割机

2016-05-04 17:07 295 查看
文件切割

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();
}
}
注意:对于输出流,如果加了缓冲流要先关缓冲流再关字节流或其他流;对于输入流,若加了缓冲流则先关字节流或其他再关缓冲流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: