需求:现在文件的大小越来越大,很多移动设备无法一次把文件一次全部拷贝完全,这种情况就需要把文件分割小点,分几次传送,然后,合并起来,这样就实现了大文件的拷贝功能
介绍:我的这个用的是吧文件分割成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();
}
}
}
部分界面截图