📄 fileunion.java
字号:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.*;
import java.io.*;
import java.util.Vector;
public class FileUnion extends JPanel implements ActionListener, Runnable,
FileFilter {
/**
* 文件合并机FileUnion extends Jpanel(public)
*/
private static final long serialVersionUID = -2910248303777262867L;
private JLabel message = new JLabel("请选择切割的文件或其所存放的文件夹,系统将自动读出所切文件");
TableTableModel HBModel = new TableTableModel("还原的文件", "还原后大小", "总块数",
"每块大小");
private Vector fileLen = HBModel.fileLen;// 文件的长度,long
private Vector subLen = HBModel.subLen;// 文件及切成每块长度,long
JTable src = new JTable(HBModel);// 表格对象table的数据来源是myModel对象
private JPanel srcCtrPanel = new JPanel();// 合并的控制面板
private JPanel nextPanel = new JPanel();// 除文件(控制)面板之外的所有面板集合。为了排版
private JButton srcChoice = new JButton("添加...");
private JButton srcDel = new JButton("删除");
private JButton srcAllDel = new JButton("全部删除");
private JTextField dest = new JTextField(20);
private JButton destChoice = new JButton("浏览...");
private ButtonGroup destSaveMode = new ButtonGroup();// 切割存储模式
private JRadioButton options[] = new JRadioButton[2];// 模式选项
private String optionLabel[] = { "为每个还原的文件创建自己的目录", "统一放在目标根目录下" };// 模式选项文本
private JPanel optionPanel = new JPanel();
private JButton startCut = new JButton("开始合并");
private JButton quit = new JButton("退出");
private JPanel srcPanel = new JPanel();// 合并的文件面板
private JPanel destPanel = new JPanel();// 合并后存放的文件夹面板
private JPanel msgPanel = new JPanel();// 消息面板
private JPanel ctrPanel = new JPanel();// 控件面板
private String destDirectory;
private JProgressBar subBar, allBar;// 进度条
private JLabel subBarLabel = new JLabel("正在合并的文件"),
allBarLabel = new JLabel("总进度:");
private JPanel barPanel = new JPanel();
private int nFile = 2;// 文件的块数,没有选择时为0
private String fileString[];// fileString=所有合并要用到的0001-9999文件(后台),
private Vector listString=new Vector();//listString=表格中显示的文件列表(前台)
private int selectFilesNumber = 0;// selectFilesNumber=选择文件的个数
private JTabbedPane page;// 页,用来回调页的方法
public FileUnion(JTabbedPane page) {// 构造函数
srcPanel.setLayout(new BorderLayout());
src.setPreferredScrollableViewportSize(new Dimension(this.getWidth(),
this.getHeight() / 3));
JScrollPane srcPane = new JScrollPane(src);
srcPanel.add(srcPane, "Center");
srcPanel.add(srcCtrPanel, "South");
srcCtrPanel.add(srcChoice);
srcCtrPanel.add(srcDel);
srcCtrPanel.add(srcAllDel);
srcChoice.addActionListener(this);
srcDel.addActionListener(this);
srcAllDel.addActionListener(this);
srcPanel.setBorder(BorderFactory.createTitledBorder("选择块文件存放的目录"));
destPanel.setLayout(new BoxLayout(destPanel, BoxLayout.Y_AXIS));
destPanel.add(dest);
dest.setEditable(false);
dest.setCursor(new Cursor(Cursor.TEXT_CURSOR));
destPanel.add(optionPanel);
optionPanel.add(destChoice);
for (int k = 0; k < options.length; k++) {
options[k] = new JRadioButton(optionLabel[k]);
destSaveMode.add(options[k]);
optionPanel.add(options[k]);
}
options[1].setSelected(true);//合并时默认将文件直接放在目标文件夹下
destChoice.addActionListener(this);
destPanel.setBorder(BorderFactory.createTitledBorder("选择还原后保存的目录"));
message.setForeground(Color.blue);// 设置提示为蓝色
msgPanel.add(message);
ctrPanel.add(startCut);
ctrPanel.add(quit);
startCut.addActionListener(this);
quit.addActionListener(this);
subBar = new JProgressBar(0, 100);
subBar.setStringPainted(true);
// subBar.setVisible(false);
allBar = new JProgressBar(0, 100);
allBar.setStringPainted(true);
// allBar.setVisible(false);
barPanel.setLayout(new BoxLayout(barPanel, BoxLayout.Y_AXIS));
barPanel.add(subBarLabel);
barPanel.add(subBar);
barPanel.add(allBarLabel);
barPanel.add(allBar);
barPanel.setVisible(false);
nextPanel.setLayout(new BoxLayout(nextPanel, BoxLayout.Y_AXIS));
nextPanel.add(destPanel);
nextPanel.add(msgPanel);
nextPanel.add(ctrPanel);
nextPanel.add(barPanel);
this.setLayout(new BorderLayout());
this.add(srcPanel, "Center");
this.add(nextPanel, "South");
this.setSize(700, 500);
this.page = page;// 需要回调页的设置,防止切割合并同时进行,破坏速度
}
/**
* @param src
* @param dest
*/
public void actionPerformed(ActionEvent e) {// 按钮事件
if (e.getSource() == srcChoice) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("请选择0001-9999序列文件或其存放目录:");
chooser.setMultiSelectionEnabled(true);// 允许选择多个文件夹
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);// 设置为选择文件夹和文件
chooser.removeChoosableFileFilter(chooser.getChoosableFileFilters()[0]);//移除"所有文件"过虑器
chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter(){//添加自己的文件过虑器
public boolean accept(File f){
if (f.isDirectory()){
return true;
}
try{
int k=Integer.parseInt(f.toString().substring(f.toString().length() - 4));
if (f.isFile() && k>=1 && k<=9999)
return true;
}catch (NumberFormatException e){
}
return false;
}
public String getDescription(){
return "切割文件(*.0001~*.9999);存放以上切割文件的目录";
}
});
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File[] directory = chooser.getSelectedFiles();
File[] file;//每个文件夹下的文件列表
//selectFilesNumber = file.length;// 获得选择文件的个数
//
int i = 0;
String fileLength = new String();// 文件大小的字符串表示
String subLength = new String();// 块的大小字符串表示
while (i++ < directory.length) {
if (directory[i-1].isDirectory()){//选择的是文件夹
file = directory[i - 1].listFiles(this);// 文件名数组
fileString = new String[file.length];// 每个文件夹下的文件列表
int j=0;
while(j<file.length){//开始遍历每个包含0001-9999序列文件的所有文件
fileString[j]=new String(file[j].toString());
String diziFile=fileString[j].substring(0, fileString[j].lastIndexOf("."));//底子文件:如a.0001,a.0002,a.0003序列文件中的a
int k=Integer.parseInt(fileString[j].substring(fileString[j].lastIndexOf(".")+1))+1;//下一个编号文件
String f=(k<1000)?((k<100)?((k<10)?(".000"+k):(".00"+k)):(".0"+k)):("."+k);
long jb=0+file[j].length();//块文件大小总和=sub1+sub2+....+subn=复原后文件大小
int nFile=1;//文件的块数
while (new File(diziFile+f).exists()){//如果下一编号文件存在,累计块文件大小
jb+=file[j+1].length();
k++;
f=(k<1000)?((k<100)?((k<10)?(".000"+k):(".00"+k)):(".0"+k)):("."+k);
nFile++;
j++;
}
listString.addElement(diziFile);
fileLen.addElement(jb);
if (nFile>1)
subLen.addElement(file[j-1].length());
else
subLen.addElement(file[j].length());
fileLength=((Long)fileLen.lastElement()<1024*1024)?(Math.round((Long)fileLen.lastElement()/1024.0*100.0)/100.0+"KB"):(Math.round((Long)fileLen.lastElement()/1024.0/1024.0*100.0)/100.0+"MB");
subLength=((Long)subLen.lastElement()<1024*1024)?(Math.round((Long)subLen.lastElement()/1024.0*100.0)/100.0+"KB"):(Math.round((Long)subLen.lastElement()/1024.0/1024.0*100.0)/100.0+"MB");
HBModel.addRow(new Object[] {
listString.lastElement(), fileLength, nFile, subLength});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -