超级文件分割《归并》机(分割大文件)
超级文件分割《合并》机(分割大文件)
需求:现在文件的大小越来越大,很多移动设备无法一次把文件一次全部拷贝完全,这种情况就需要把文件分割小点,分几次传送,然后,合并起来,这样就实现了大文件的拷贝功能
介绍:我的这个用的是吧文件分割成1M大小的文件,当然,可以改成很大的容量,这个只要改变下就行了。合并也可以的。
package cn.hncu.IO; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; 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.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class GraphFileSplit extends JFrame implements ActionListener{ JButton btnsplit,btnmerge; String filename; static JTextField tf; public GraphFileSplit(){ setTitle("文件分割器"); this.setLayout(new FlowLayout());//采用流布局方式 this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setBounds(100, 100,400, 500);//设置边界 JLabel lb=new JLabel("请选择类型");//标签 btnsplit= new JButton("分割文件"); btnmerge=new JButton("合并文件");//按钮 btnsplit.addActionListener(this); JLabel lb2=new JLabel("文件分割后存放在当前目录下的“Split”\r\n"); JLabel lb3=new JLabel("请注意: 文件合并后的文件存放在你电脑E盘的的ex目录下\r\n"); tf=new JTextField(30); //添加组件 btnmerge.addActionListener(this); this.getContentPane().add(lb); this.getContentPane().add(btnsplit); this.getContentPane().add(btnmerge); this.getContentPane().add(lb2); this.getContentPane().add(lb3); this.getContentPane().add(tf); this.setResizable(false); this.setVisible(true); } public static void main(String[] args) { new GraphFileSplit(); //主函数,new 对象 } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btnsplit){//对分割按钮进行监听 JFileChooser jf=new JFileChooser();//文件选择器 int resout=jf.showOpenDialog(null); if(resout==JFileChooser.APPROVE_OPTION){ File file=jf.getSelectedFile(); filename=file.getName(); // System.out.println(file.getAbsolutePath());//这样包含有文件名;C:\Users\xinxin\Documents\Beyond - 光辉岁月.mp3 // System.out.println(file.getParent());//C:\Users\xinxin\Documents // System.out.println(file.getName());//Beyond - 光辉岁月.mp3 // System.out.println(file); File des=new File(file.getParent(),"fileSplit");//file.getParent()可以得到文件名之前的绝对路径 try { Split(file,des); } catch (IOException e1) { throw new RuntimeException("分割出现错误"); } } } if(e.getSource()==btnmerge){ File[] file;//将选中的文件有文件数组装 JFileChooser jf=new JFileChooser(); jf.setMultiSelectionEnabled(true); int resout=jf.showOpenDialog(null); if(resout==JFileChooser.APPROVE_OPTION){ file =jf.getSelectedFiles(); if(file.length==0){ throw new RuntimeException("文件不存在"); } try { merge(file,filename); } catch (IOException e1) { e1.printStackTrace(); } } } } private void merge(File[] file,String filename) throws IOException {//合并的时候用到合并流 ArrayList<FileInputStream> alist=new ArrayList<FileInputStream>(); for(int i=0;i<file.length;i++){ // System.out.println(file[i].getParent());//分割后输出文件路径 alist.add(new FileInputStream(new File( file[i].getParent(),file[i].getName()))); } Enumeration<FileInputStream> en =Collections.enumeration(alist); SequenceInputStream se =new SequenceInputStream(en); String paht="e:\\ex\\";//只能合并后的存储路径,告诉用户路径 File file0=new File(paht); if(!file0.exists()){ file0.mkdirs();//文件不存在就创建一个 } // System.out.println(filename+"11111111"); // System.out.println(file0+ filename+"fileoasdasdsasdas"); if(filename==null){ filename="split.txt"; } FileOutputStream out =new FileOutputStream(file0+ "\\"+filename); tf.setText("合并的文件存放在"+file0+"\\"+filename); int len =0; byte []b=new byte[1024*1024];//开始合并 while((len=se.read(b))!=-1){ out.write(b, 0, len); } out.close(); se.close(); } //分割核心代码 private static void Split(File file, File des) throws IOException { FileInputStream in =new FileInputStream(file);//分割必须先读进数组,数组空间开1M大小 FileOutputStream out=null; int count=1; if(!des.exists()){ des.mkdirs(); } byte a[]=new byte[1024*1024];//大小为1M int len=0; while((len=in.read(a))!=-1){ String desrc=file.getName()+(count++); File f=new File(des,desrc); out =new FileOutputStream(f); tf.setText("分割完成后,文件放在"+f.getParent()); out.write(a,0,len); out.close(); } } }
部分界面截图
版权声明:本文为博主原创文章,未经博主允许不得转载。