文件切割与合并

来源:互联网 发布:淘宝网购物女装毛衣 编辑:程序博客网 时间:2024/05/17 08:05

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

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

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

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

代码实现:

<span style="font-family:Times New Roman;font-size:14px;">package cn.hncu.io.ex;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;import javax.swing.JOptionPane;import cn.hncu.io.array_sequence.SequenceInputStreamDemo;public class FileSplitEx {public static void main(String[] args) {JFileChooser jfc = new JFileChooser();int result =jfc.showOpenDialog(null);if(result==JFileChooser.APPROVE_OPTION){File file = jfc.getSelectedFile();//System.out.println(file.getName());File dir = file.getParentFile();//System.out.println(dir.getAbsolutePath());try {//把file切割,切割得到的碎片存放在dir目录下的一个新文件夹fileSplit(file,dir);String fileName=file.getName();File desDir = new File(dir,"scripts");mergerFile(desDir,fileName);} catch (IOException e) {JOptionPane.showMessageDialog(null, "文件切割失败");}}else{JOptionPane.showMessageDialog(null, "请选择要切割的文件");return;}}private static void fileSplit(File file, File dir) throws IOException {File desDir = new File( dir.getAbsolutePath()+"/scripts" );if(!desDir.exists()){//记得用File为IO开道desDir.mkdirs();}//inputStream/outputStream//源FileInputStream fin = new FileInputStream(file);FileOutputStream fout = null;int len=0;byte buf[] = new byte[1024*1024];int count=1;while( (len=fin.read(buf))!=-1 ){//fileName="录像91.lxe" String str = file.getName();String nm = str.substring(0,str.lastIndexOf("."));//System.out.println(nm);String fileName =nm+"("+(count++)+").part";fout = new FileOutputStream(desDir.getAbsolutePath()+"/"+fileName);fout.write(buf, 0, len);fout.close();}fin.close();JOptionPane.showMessageDialog(null, "文件切割完毕!");}private static void mergerFile(File srcDir, String fileName) throws IOException {if(!srcDir.exists()){JOptionPane.showMessageDialog(null, "合并文件夹不存在!");return;}File partFiles[] = srcDir.listFiles();if(partFiles==null || partFiles.length==0){JOptionPane.showMessageDialog(null, "碎片文件不存在!");return;}ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();//list.add( new FileInputStream("aa.录像91(1).part") );//list.add( new FileInputStream("aa.录像91(2).part") );for(int i=0;i<partFiles.length;i++){//System.out.println(">>>>>"+ fileName+"("+ (i+1) +").part");String nm = fileName.substring(0, fileName.lastIndexOf(".")); // aa.录像91.lxe  ==>  aa.录像91////System.out.println(">>>>>"+ nm+"("+ (i+1) +").part");list.add( new FileInputStream( new File(srcDir, nm+"("+ (i+1) +").part") )  );//list.add(new FileInputStream(partFiles[i].getAbsolutePath()));}Enumeration<FileInputStream> en = Collections.enumeration(list);SequenceInputStream sis =  new SequenceInputStream(en);FileOutputStream fout = new FileOutputStream(new File(srcDir,fileName) );byte buf[] = new byte[1024];int len=0;while( (len=sis.read(buf))!=-1){fout.write(buf, 0, len);}sis.close();fout.close();}}</span>

 

这里我以切割Api为例:

如图:

此代码还有诸多不足之处,还需以后改正。

0 0
原创粉丝点击