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

时间:2023-01-22 22:08:44

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

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

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

文件切割:

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

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

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

用户可以指定切割后的碎片每个碎片的大小,以KB为单位。

1(KB)的整数倍。

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

文件合并:

选择一个由本软件分割的碎片,(前提是所有碎片都在原来那个文件夹下,而且不能有多的文件,只能是那个文件的所有碎片)

会自动在当前目录下合并成原来的文件。

合并完毕后会有提示。

先看下程序的图片与说明吧,

完整的源代码在最后会贴上。

准备需要切割的文件:

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

程序的主界面:

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

选择要被切割的文件:

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

指定碎片文件的大小:

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

文件切割完毕:

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

对比一下文件的大小:

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

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

合并文件前的提示:

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

选择文件碎片:

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

文件合并完成:

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

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

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

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

完整代码:

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---练习:文件切割与合并&lpar;1&rpar;

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

  3. java 流操作对文件的分割和合并的实例详解&lowbar;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文件处理之压缩&comma;分割

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

随机推荐

  1. delphi 调用百度地图api

    一.调用javascript的方法 两种: 第一种:采用自编函数的方法 function ExecuteJavaScript(WebBrowser:TWebBrowser; Code: string) ...

  2. Sql server之路 (五)插入多条数据

    public bool GetDataUsingDataTaskReason(StationReasonCollection reason) { try { strCon.Open(); DateTi ...

  3. zookeeper集群实例

    zookeeper是什么 Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,应用于分布式应用的协作服务, ...

  4. java基础-01基本概念

    java的特点 跨平台 所谓的平台,我们可以理解为操作系统. 大部分语言是不能跨平台的,比如c语言的程序在windows和linux上需要编写不同的代码. java程序是运行在JVM(Java Vir ...

  5. HTML5 Canvas爱心时钟代码

    这是一款数字时钟动画,数字又多个小爱心组成,又何问起整理,随着时间推进,每一秒钟新数字替换旧数字,旧数字离去使用天女散花动画,花是五颜六色的. 查看效果:http://hovertree.com/te ...

  6. 转:VIM选择文本块&sol;复制&sol;粘贴

    VIM选择文本块/复制/粘贴 - lcj_cjfykx的专栏 - CSDN博客https://blog.csdn.net/lcj_cjfykx/article/details/9091569

  7. ListView的基本使用方法和RecyclerView的基本使用方法

    ListView是一种用于列表显示数据内容的控件,它可以通过适配器实现对于数据的列表显示,而RecyclerView是对于ListView优化后的列表数据显示控件. 个人对于List的使用经历多半在新 ...

  8. 【QT】QT下载与安装

    很简单 1.下载地址 http://download.qt.io/archive/qt/ 学个单词,archive. 选择一个版本下载,5.9.3. 2.安装 选择组件 MinGW就行了,MinGW- ...

  9. Too much thinking&excl; Too much annoying&period;

    I am now in great demand for an opportunity to yearn for, the ability to express myself, in a maximu ...

  10. 使用Selenium模拟浏览器抓取淘宝商品美食信息

    代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...