Java---文件的切割与合并,已经实现图形界面(工具)

实现对任意文件的切割,实现对切割后的文件的合并。

上次只写了特定目录下的文件切割与合并,有点遗憾,
这次,我写了一个图形界面来实现对文件的切割与合并。

文件切割:
用户可以自己选择需要切割的文件,
软件会自动将切割后的文件全部放入这目录下的一个新文件夹当中去的。
每分割一个新的文件,它都会自动生成一个新文件夹,新文件夹不会重名,它是根据需要切割的文件名按和后缀加了一个字符串命名的文件夹。

用户可以指定切割后的碎片每个碎片的大小,以KB为单位。
1(KB)的整数倍。

文件切割完毕后会有提示。

文件合并:

选择一个由本软件分割的碎片,(前提是所有碎片都在原来那个文件夹下,而且不能有多的文件,只能是那个文件的所有碎片)
会自动在当前目录下合并成原来的文件。

合并完毕后会有提示。

先看下程序的图片与说明吧,
完整的源代码在最后会贴上。

准备需要切割的文件:

程序的主界面:

选择要被切割的文件:

指定碎片文件的大小:

文件切割完毕:

对比一下文件的大小:

从图片上可以看到,原文件和切割后的所有碎片加起来的字节是一样的!!!

合并文件前的提示:

选择文件碎片:

文件合并完成:

对比一下文件的创建时间:

完整代码:

package io.app.fileSplit;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * 文件切割与合并
 * @author 陈浩翔
 * @version 1.0  2016-4-28
 *
 */
public class FileSplit2 extends JFrame {

    private JPanel jp ;
    private JLabel jlb;
    private JButton btnFileCut ;
    private JButton btnFileJoin ;
    private JLabel label;
    private JLabel label1;
    private Font font;

    public FileSplit2() {
        super("chx版权所有!");
        initComponents();
    }

    private void initComponents() {
        //标签
        label1 = new JLabel("        文件切割合并工具1.0");

        font = new Font(null, Font.BOLD, 28);

        //设置背景图片!!!!!!!!!!!!!
        label = new javax.swing.JLabel();//标签
        ImageIcon im = new javax.swing.ImageIcon(
                "E:\\ChxJavaWork\\myThreadIo2\\jiemian3.jpg");
        label.setIcon(im);
        //添加背景图片
        label.setBounds(0, 0, im.getIconWidth(), im.getIconHeight());
        //设置位置和大小
        jp = (JPanel) this.getContentPane();
        //把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 

        jp.setOpaque(false);
        //内容窗格默认的布局管理器为null
        jp.setLayout(null);

        //文件切割按钮
        btnFileCut = new JButton("文件切割");
        btnFileCut.setSize(160, 100);
        //btnFileCut.setForeground(Color.RED);字体颜色
        btnFileCut.setBackground(Color.pink);//背景颜色
        btnFileCut.setLocation(im.getIconWidth()*1/10,im.getIconHeight()*13/20);
        btnFileCut.setFont(font);

        jp.add(btnFileCut);

        //文件合并按钮
        btnFileJoin = new JButton("文件合并");
        btnFileJoin.setFont(font);
        btnFileJoin.setBackground(Color.pink);
        btnFileJoin.setBounds(im.getIconWidth()*13/20,im.getIconHeight()*13/20,160, 100);
        jp.add(btnFileJoin);

        btnFileCut.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    btnFileCutActionPerformed(e);
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        });

        btnFileJoin.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    btnFileJoinActionPerformed(e);
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        });

        label1.setBounds(20, 20, im.getIconWidth(), 50);
        label1.setFont(new Font(null,Font.BOLD, 40));
        label1.setForeground(Color.red);
        jp.add(label1);

        jlb = new JLabel();
        jlb.setBounds(btnFileCut.getX()+100, btnFileCut.getY()-400, 400 , 350);
        jlb.setFont(new Font(null, Font.BOLD, 25));
        jp.add(jlb);

         // 把背景图片添加到分层窗格的最底层作为背景
        this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
        //为前面创建的标签 设置层的深度,这里将其设置为了最底层,因为Integer.MIN_VALUE是int类型的最小值了
        this.getLayeredPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        //让关闭按钮起作用

        setBounds(new java.awt.Rectangle(200, 200,im.getIconWidth(), im.getIconHeight()));

        this.setResizable(false);//设置窗口不能缩放
    }

    //文件切割
    protected void btnFileCutActionPerformed(ActionEvent e) throws IOException {
        //System.out.println("文件切割!");

        JFileChooser jfc = new JFileChooser();
        int result = jfc.showOpenDialog(this);
        int num=0;
        File file = null;
        File desDir = null;
        if(result == JFileChooser.APPROVE_OPTION){
            file = jfc.getSelectedFile();
            //System.out.println(file.getName());//文件名
            //System.out.println(file.getParent());//绝对路径

            String strNum = JOptionPane.showInputDialog("请输入文件需要按照多少KB一个文件来分割!(默认为1024KB)", "1024");
            if(strNum==null){
                JOptionPane.showMessageDialog(this, "未给定分割文件的大小,此次文件分割已取消!");
                //System.out.println("end");
                return;
            }else{
                try {
                    num = Integer.parseInt(strNum);
                } catch (NumberFormatException e1) {
                    JOptionPane.showMessageDialog(this, "给定数字格式错误,此次文件分割已取消!");
                    return;
                }
            }

            String strs[] =file.getName().split("\\.");
            String str="";
            for(int i=0;i<strs.length-1;i++){
                //System.out.println(strs[i]);
                str= str +strs[i];
            }
            str = str+"SplitFile"+strs[strs.length-1];
            //System.out.println(str);
            desDir = new File(file.getParent(), str);
            //1明确源---硬盘,字节 file
            FileInputStream fis = new FileInputStream(file);
            //2明确目的---硬盘,字节 desDir
            FileOutputStream fos = null;
            if(!desDir.exists()){
                desDir.mkdir();
            }

            //3根据是否需要加强功能决定是否要再套接,然后进行读写
            BufferedInputStream bis = new BufferedInputStream(fis);
            byte[] buf = new byte[1024];//每次读1KB
            int len = 0;
            int numLen = 0;
            int count=1;
            boolean flag = true;
            BufferedOutputStream bos = null;
            long kbing = 1;

            String fileName = null;
            while(true){
                if(flag){
                    fileName = strs[0]+(count++)+".chx";
                    fos = new FileOutputStream(desDir+"\\"+fileName);
                    bos = new BufferedOutputStream(fos);
                    flag=false;
                }

                if(numLen>=num){
                    //注意,输出时,一定要先关外层的流,再关里层的流。
                    //否则,外层输出流中的残留数据刷不出去! 输入流的关闭顺序则相反!
                    bos.close();
                    fos.close();
                    numLen=0;
                    flag=true;
                    continue;
                }

                len = bis.read(buf);

                if(len==-1){
                    bos.close();
                    fos.close();
                    break;
                }

                bos.write(buf, 0, len);
                numLen++;
                //jlb.setText("已经切割["+kbing*numLen+"]KB...");
            }
            fis.close();
            bis.close();
            jlb.setText("文件\""+file.getName()+"\"已经切割完!");
            this.validate();

        }
    }

    //文件合并
    protected void btnFileJoinActionPerformed(ActionEvent e) throws IOException {
        //System.out.println("文件合并!");
        //提示!!!
        JOptionPane.showMessageDialog(this, "请随便选择一个被切割成碎片的文件!\t\n" +
                "确保所有被切割的文件都在这层目录下,且不包含其他文件。\t\n" +
                "合并后的文件在当前目录下!");

        JFileChooser jfc = new JFileChooser();
        int result = jfc.showOpenDialog(this);
        File file = null;
        File desDir = null;
        String fileName = null;

        if(result==JFileChooser.APPROVE_OPTION){
            file = jfc.getCurrentDirectory();
            String str = file.getAbsolutePath();

            //注意!!!!!!!!!!!!!!!!!!!!
            /*
             '\'在java中是一个转义字符,所以需要用两个代表一个。
             例如System.out.println( "\\" ) ;只打印出一个"\"。
             但是'\'也是正则表达式中的转义字符(replaceAll 的参数就是正则表达式),
             需要用两个代表一个。所以:\\\\被java转换成\\,\\又被正则表达式转换成\。
             */
            str = str.replaceAll("\\\\", "#chx#@");
            //System.out.println(str);
            String strs[] = str.split("#chx#@");
//          for(int i=0;i<strs.length;i++){
//              System.out.println(strs[i]);
//          }
            fileName = strs[strs.length-1];
            //System.out.println(fileName);
            strs = fileName.split("SplitFile");
            fileName = strs[0]+"."+strs[1];
            //System.out.println(fileName);

            //用序列流合并
            ArrayList<FileInputStream> ar = new ArrayList<FileInputStream>();
            for(int i=1;i<=file.listFiles().length;i++){
                ar.add(new FileInputStream(file+"\\"+strs[0]+i+".chx"));
            }
            Enumeration<FileInputStream> en = Collections.enumeration(ar);
            SequenceInputStream sis = new SequenceInputStream(en);

            FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);
            BufferedOutputStream bof = new BufferedOutputStream(fos);

            byte buf[] = new byte[1024];
            int len = 0;
            while((len=sis.read(buf))!=-1){
                bof.write(buf, 0, len);
            }
            //注意,输出时,一定要先关外层的流,再关里层的流。
            //否则,外层输出流中的残留数据刷不出去! 输入流的关闭顺序则相反!
            bof.close();
            fos.close();

            jlb.setText("文件\""+fileName+"\"已经合并完!");
            this.validate();
        }

    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FileSplit2().setVisible(true);
            }
        });
    }

}
时间: 2024-10-01 07:36:12

Java---文件的切割与合并,已经实现图形界面(工具)的相关文章

使用JAVA编写一个聊天程序,要求有图形界面,还有就是要显示联系人,后天就要交作业了,求大神!

问题描述 JAVA编写,聊天程序,有图形界面,还有界面显示联系人,类似于QQ的,但是极简的就行,求大神帮助啊,我后天就要交了,谢谢大神!!!!! 解决方案 解决方案二:网上有源代码--解决方案三:哪里有,我怎么没有找到,帮忙找一下!解决方案四:引用1楼u013335717的回复: 网上有源代码-- 哪里有,我怎么没有找到,帮忙找一下!解决方案五:上大学的时候写过好像还在U盘里趴着呢

Java文件的拆分与合并(二)

package cn.com; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; //文件的拆分和组合 //步骤: //1 依据源文件大小和每块的大小计算出块数 //2 将每一块写到一个对应的文件 public class FileSeparatorAndUnite { long rawFileSize; lo

Java文件的拆分与合并(一)

package cn.com; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; //文件的拆分和组合 //步骤: //1 依据源文件大小和每块的大小计算出块数 //2 将每一块写到一个对应的文件 public class FileSeparatorAndUnite { long rawFileSize; lo

Java---练习:文件切割与合并(1)

实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过1M.自己可把功能进一步扩展:切割前的文件名.长度,切割后的碎片个数.文件名等信息可写到第一个碎片中或另外用properties把这些写到配置文件中. 文件合并:这里简单假设已知被合并目录的File对象和原文件的名字.其实这些完全可以做成活的,如把这些信息保存在碎片文件或配置文件,也可以同样用文件选

【android相关】【问题解决】R.java文件丢失

在进行android开发过程中,有时候,我们会遇到gen文件中R.java丢失的现象.重新build,或者clean工程,close并重新打开Project,但有时也没解决. 这可能是由于不小心把xml文件写错了,或者在编辑xml或者其他文件时候点击了run,或者clear过项目等...,反正,你会发现gen下面的R.java的文件找不到了. 其实,只要xml文件有问题,系统就不会给自动生成R.java文件,因为系统需要参照每个xml里的数据来生成R.java. 当然,如果项目较大,而layou

图片-Eclipse编译Java文件出现空指针错误,求大神指教如何改正

问题描述 Eclipse编译Java文件出现空指针错误,求大神指教如何改正 另外出现错误的代码 主函数 public static void main(String[] args) { Login login = new Login(RELOAD); login.setVisible(true); } public Login() { super(); initialize(); } public Login(boolean reload) { super(); initialize(); ne

java文件操作大全

java文件操作大全 文件的建立/检查与删除<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.io.*"%><html><head><title>文件的建立.检查与删除</title></head><body><%String path=request.getRealPath

如何在 vim 中更好的编辑 java 文件

这次介绍一下如何在 vim 中更好的编辑 java 文件.作者: camry.wu@gmail.com 1. javabrowser 编辑类文件时, 类资源树是个有用的东西, 可以把类的成员, 方法等等很直观的 显示出来. 在 vim 中也可以实现好像 vc, jbuilder 那样的类资源树, 当然比 那些会简单些, 不过也够好用的了. 就是用 javabrowser.vim 这个脚本实现的. 先到 vim online 去找到这个脚本文件.(在这还能找到许多有用的其他脚本) 然后在 goog

Eclipse不自动编译java文件的解决方法

最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般是如下几个步骤.但是还是不自动编译. 最基本的解决办法--这是前提 然后clean和refresh下项目.如果这样还是不行,用下面的方法吧,终极解决方案...... 1:去除项目中的jre的classpath 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.