博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java---文件的切割与合并,已经实现图形界面(工具)
阅读量:5954 次
发布时间:2019-06-19

本文共 8445 字,大约阅读时间需要 28 分钟。

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

上次只写了特定目录下的文件切割与合并,有点遗憾,

这次,我写了一个图形界面来实现对文件的切割与合并。

文件切割:

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

用户可以指定切割后的碎片每个碎片的大小,以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
=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
ar = new ArrayList
(); for(int i=1;i<=file.listFiles().length;i++){ ar.add(new FileInputStream(file+"\\"+strs[0]+i+".chx")); } Enumeration
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); } }); }}
你可能感兴趣的文章
CentOS7 64位小型操作系统的安装
查看>>
线程互互斥锁
查看>>
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
网址收藏
查看>>
2013 Linux领域年终盘点
查看>>
linux学习之查看程序端口占用情况
查看>>
相逢在栀枝花开的季节
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>
mysql多实例实例化数据库
查看>>
我的友情链接
查看>>
golang xml和json的解析与生成
查看>>
javascript 操作DOM元素样式
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
【查找算法】基于存储的查找算法(哈希查找)
查看>>
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
记录一下这次web实训的两个网站
查看>>