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);
}
});
}
}
Java---文件的切割与合并,已经实现图形界面(工具)的更多相关文章
- 关于JAVA的FlowLayout流动布局的换行问题--图形界面
我在网上寻找Java流动布局换行的方法,看了好久,也没有找到满意的答案. FlowLayout是流式布局,所以如果需要让换行有意义,就得锁定窗口的大小,否则随着窗口的伸缩,布局将被彻底打乱. 网上的方 ...
- Java---练习:文件切割与合并(1)
实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...
- java 流操作对文件的分割和合并的实例详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...
- Java文件合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- Java学习笔记——SequenceInputStream类合并文件的综合举例分析
SequenceInputStream 介绍 SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并. 它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾, ...
- Centos大文件切割和合并
现在很多公司都会把项目放在云服务器上,当我想把云服务器里面的代码和生成的文件 “sz 文件名称” down下来的时候,发现太大.云服务器不支持下载很大的文件.那么这种情况就需要使用split命令切割文 ...
- Java 文件IO续
文件IO续 File类 用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...
- java文件处理之压缩,分割
http://blog.csdn.net/ycg01/article/details/1366648 java文件处理之压缩,分割 标签: javaexceptionimportnullbytefil ...
随机推荐
- SPOJ 345 - Mixtures 区间动态规划
有n个混合物排成一排,每个混合物有一个颜色值0<=color<=99, 规定合并只能合并相邻两个, 将颜色a的混合物与颜色b的混合物合并后,颜色为( a+b ) % 100,并产生a*b的 ...
- android requestWindowFeature使用详解
requestWindowFeature可以设置的值有: 1.DEFAULT_FEATURES:系统默认状态,一般不需要指定 2.FEATURE_CONTEXT_M ...
- 开源的Android开发框架-------PowerFramework使用心得(二)图片异步加载ImageTask
图片异步加载.可以备注图片是否缓存.缓存状态. 1.缓存-SD卡,路径可设置 2.图片压缩 3.可加载本地和网络图片 4.url为本地视频文件可以显示缩略图 5.中文url图片地址FileNotFou ...
- NPOI对excel文件的导入导出
现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICe ...
- tableView代理方法的调用时间,(主要是heightForRowAtIndexPath和cellForRowAtIndexPath调用时间)
最近做一个demo,涉及按照数据分类然后依照分类在 cellForRowAtIndexPath形成不同类型的cell,就是有判断(在viewdidload里面做)和形成(在 cellForRowAtI ...
- PLSQL Package dubug方法
初步接触EBS代码修改,花了几个小时搞明白了Package的debug方法, 1.打开需要测试的package,找到需要测试的过程,右键选择测试 2.在测试窗口中初始化过程的入参,点击测试按钮开始调试 ...
- linux ulimit的使用,如何产生core文件,调试段错误
---恢复内容开始--- 下面先简单介绍下ulimit命令: 1. limit -a 可以查看系统各种资源的限制,如: core文件大小,数据段的大小等. $ ulimit -a core file ...
- extjs之messagebox按钮显示中文
在extjs中我们用到了很多的提示框,但是在对话框按钮上面显示的都是英文的ok.yes.no.cancel,这里给出一个方法,能够使得提示框的按钮文本显示问中文. extjs在加载完成之后会调用页面的 ...
- [Git]Git安装
1.什么是Git Git是一个分布式版本控制/软件配置管理软件, git是用于Linux内核开发的版本控制工具, 与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法 ...
- UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)
紫书例题p245 Piotr found a magical box in heaven. Its magic power is that if you place any red balloon i ...