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

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

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

文件切割:

用户可以自己选择需要切割的文件,

软件会自动将切割后的文件全部放入这目录下的一个新文件夹当中去的。

每分割一个新的文件,它都会自动生成一个新文件夹,新文件夹不会重名,它是根据需要切割的文件名按和后缀加了一个字符串命名的文件夹。

用户可以指定切割后的碎片每个碎片的大小,以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);
}
});
} }

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

  1. 关于JAVA的FlowLayout流动布局的换行问题--图形界面

    我在网上寻找Java流动布局换行的方法,看了好久,也没有找到满意的答案. FlowLayout是流式布局,所以如果需要让换行有意义,就得锁定窗口的大小,否则随着窗口的伸缩,布局将被彻底打乱. 网上的方 ...

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

    实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...

  3. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  4. Java文件合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  5. Java学习笔记——SequenceInputStream类合并文件的综合举例分析

    SequenceInputStream 介绍 SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并. 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾, ...

  6. Centos大文件切割和合并

    现在很多公司都会把项目放在云服务器上,当我想把云服务器里面的代码和生成的文件 “sz 文件名称” down下来的时候,发现太大.云服务器不支持下载很大的文件.那么这种情况就需要使用split命令切割文 ...

  7. Java 文件IO续

    文件IO续 File类    用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作    File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...

  8. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  9. java文件处理之压缩,分割

    http://blog.csdn.net/ycg01/article/details/1366648 java文件处理之压缩,分割 标签: javaexceptionimportnullbytefil ...

随机推荐

  1. linux下显卡信息的查看

    lspci  | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...

  2. [转] JavaScript中的字符串操作

    一.概述    字符串在JavaScript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更 多....JavaScript的核心部分提供 ...

  3. iOS中navigationItem的titleView如何居中

    开发过程中,发现titleview很难居中,通过各种尝试终于找到了解决方法. 首先清楚你个概念: leftBarButtonItem,导航条中左侧button. rightBarButtonItem, ...

  4. IDL实现主成分变化(PCA)

    IDL只能通过调用envi的二次接口做图像的变换,但是对于普通的数据没有提供函数.根据主成分变换的原理,用IDL写出来了,这样就不用每次再去用matlab的princomp去做了.主成分变化的基本过程 ...

  5. 兼容所有浏览器的JQuery zClip插件实现复制到剪贴板功能

    相信这个功能大家平时上网经常能碰到,以前也没怎么留意怎么实现的,直到项目中需要. 网上一搜一大堆,单纯使用js方法也不是没有,但是由于各浏览器的安全机制不同,不是跨浏览器的.去看了几个常用的网站,都是 ...

  6. Android比较实用的属性

    ImageView //设置图片填充整个背景 android:scaleType="fitXY"

  7. gulp初涉

    1.什么是gulp? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用它,不仅可以很 ...

  8. Html5 Canvas Text

    html5 canvas中支持对text文本进行渲染;直接的理解就是把text绘制在画布上,并像图形一样处理它(可以加shadow.gradient.pattern.color fill等等):既然它 ...

  9. jAVA EE里什么是链式调用

    链式调用就是每次调用完了过后返回的是自己,比如Hibernate里面执行hql需要设置参数时,每次设置完参数可以继续使用点设置下一个参数http://blog.sina.com.cn/s/blog_4 ...

  10. 17个提升iOS开发效率的必用工具

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...