⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileunion.java

📁 一个JAVA实现的文件切割工具
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -