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

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

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

文件切割:

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

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

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

用户可以指定切割后的碎片每个碎片的大小,以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. mac下使用brew安装svn javahl的问题

    eclipse老提示javahl太久必须得1.8以上,以前不知道什么时候在/usr/bin装过1.7的svn. 1. 删除1.7的svn sudo rm /usr/bin/svn 2.使用brew安装 ...

  2. Android Studio下打jar包

    在我们使用Eclipse时,我们常常使用的第三方类库文件大多都是jar包形式,用起来很方便.但是jar包只能打包class文件,对于Android UI类库而言,我们常常需要打包资源文件,对于界面不多 ...

  3. U口破解指令介绍.

  4. codevs 3336 电话网络

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...

  5. 使用WMI来控制Windows目录 和windows共享机制

    1.使用WMI来控制Windows目录 本文主要介绍如何使用WMI来查询目录是否存在.文件是否存在.如何建立目录.删除目录,删除文件.如何利用命令行拷贝文件,如何利用WMI拷贝文件 using Sys ...

  6. ftp文件操作

    PHP FTP操作类( 上传.拷贝.移动.删除文件/创建目录 ) 2016-06-01 PHP编程 /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ ...

  7. Uncaught SyntaxError: Unexpected end of input

    js报错  原因:输入的意外终止…… 页面代码写的不规范啊……其中的某条语句,没有正常结束…… 或者部分语句“‘’”双引号,单引号没有配对好,被转义了之类的……错误造成的 代码: <script ...

  8. php字符串常见面试题

    >> 本文固定链接: http://php.ncong.com/mianshi/mianshiti_string.html >> 转载请注明: 恩聪php 2014年09月02 ...

  9. python中的formatter的详细用法

    今天抽空学习了一下python中的string service中的formatter的相关用法,主要是为了让自己的代码看起来更加和谐,因为很多java或者c语言过来的开发者都不怎么爱使用python的 ...

  10. Memcached源码分析——hash

    以下为memcached中关于使用的hash算法的一点记录 memcached中默认使用的是Bob Jenkins的jenkins_hash算法 以下4段代码均在memcached-1.4.22/ha ...