import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.beans.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
/*主函数*/
public class FileCutter
{
public static void main(String[] args)
{
FileCutterFrame frame = new FileCutterFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
}
}
/*框架*/
class FileCutterFrame extends JFrame
{
public FileCutterFrame()
{
setTitle("Super File Cutter");
setBounds(450,150,460,465);
JTabbedPane tab = new JTabbedPane(JTabbedPane.TOP); /*建立标签*/
FileCutPanel panel1 = new FileCutPanel();
FileMergePanel panel2 = new FileMergePanel();
tab.add(panel1,"File Cut");
tab.add(panel2,"File Merge");
add(tab);/*添加标签*/
}
}
/*文件切割标签面板*/
class FileCutPanel extends JPanel
{
/*私有化定义组件*/
private JTextField tfName = new JTextField();
private JTextField tfSize = new JTextField();
private JTextField tfTargetFile = new JTextField();
private JTextField tfOtherSize = new JTextField();
private JTextField tfBlockNumber = new JTextField();
private JButton button1 = new JButton("...");
private JButton button2 = new JButton("...");
private JButton buStart = new JButton("Start cutting");
private JRadioButton size1 = new JRadioButton("1.44MB",true);
private JRadioButton size2 = new JRadioButton("1.2MB");
private JRadioButton size3 = new JRadioButton("720KB");
private JRadioButton size4 = new JRadioButton("360KB");
private JRadioButton size5 = new JRadioButton("Self defined");
private ButtonGroup group = new ButtonGroup();
private JLabel laName = new JLabel("File Name: ");
private JLabel laSize = new JLabel("File Size: ");
private JLabel tfBlockSize = new JLabel("Block Size: ");
private JLabel laOtherSize = new JLabel("KB");
private JLabel laBlockNumber = new JLabel("Number of block: ");
private JLabel laTargetFile = new JLabel("Target File: ");
private JProgressBar pbj = new JProgressBar();/*滚动条*/
private int len = 1000;
private long size;
private int number = 0;
private String name1;
private String name2;
private String filename;
/*构造函数*/
public FileCutPanel()
{
setLayout(null);/*不使用布局*/
button1.addActionListener(new FileOpenListener());
add(laName);
add(tfName);
tfName.setEditable(false);
add(button1);
add(laSize);
add(tfSize);
tfSize.setEditable(false);
add(tfBlockSize);
group.add(size1);
group.add(size2);
group.add(size3);
group.add(size4);
group.add(size5);
add(size1);
size1.addActionListener(new FileOpenListener());
size2.addActionListener(new FileOpenListener());
size3.addActionListener(new FileOpenListener());
size4.addActionListener(new FileOpenListener());
size5.addActionListener(new FileOpenListener());
tfOtherSize.addActionListener(new FileOpenListener());
add(size2);
add(size3);
add(size4);
add(size5);
add(tfOtherSize);
add(laOtherSize);
add(laBlockNumber);
add(tfBlockNumber);
tfBlockNumber.setBounds(140,250,100,20);
tfBlockNumber.setEditable(false);
add(laTargetFile);
add(tfTargetFile);
tfTargetFile.setEditable(false);
button2.addActionListener(new FileOpenListener());
add(button2);
button2.setBounds(360,290,40,20);
buStart.addActionListener(new FileOpenListener());
add(buStart);
buStart.setBounds(20,350,110,20);
pbj.setValue(0);
pbj.setStringPainted(true);
add(pbj);
/*绝对坐标添加组件*/
tfSize.setBounds(90,50,250,20);
button1.setBounds(360, 17, 40, 20);
tfTargetFile.setBounds(140,290,200,20);
tfName.setBounds(90, 17, 250, 20);
tfOtherSize.setBounds(270,170,60,20);
tfBlockSize.setBounds(20,100,100,20);
size1.setBounds(130,100,100,20);
size2.setBounds(270,100,100,20);
size3.setBounds(130,135,100,20);
size4.setBounds(270,135,100,20);
size5.setBounds(130,170,100,20);
laOtherSize.setBounds(330,170,40,20);
laBlockNumber.setBounds(20,250,100,20);
laSize.setBounds(20, 50, 100, 20);
laTargetFile.setBounds(20,290,100,20);
laName.setBounds(20, 17, 100, 20);
pbj.setBounds(140,350,200,20);
}
/*监听器内部类*/
private class FileOpenListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == button1)
{
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(null);
if(JFileChooser.CANCEL_OPTION!=result)
{
name1 = chooser.getSelectedFile().getPath();
filename = chooser.getSelectedFile().getName();
size = chooser.getSelectedFile().length();
tfName.setText(name1);
tfSize.setText(size+" ");
}
}
if (e.getSource() == button2)
{
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = chooser.showSaveDialog(null);
if(JFileChooser.CANCEL_OPTION!=result)
{
name2 = chooser.getSelectedFile().getPath();
tfTargetFile.setText(name2);
}
}
if(e.getSource()==buStart)
{
if(number!=0)
{
doCut r =new doCut();
r.start();
}
else
System.out.println("非法操作,无法切割!");
}
if (e.getSource() == size1)
{
len = (int)(1024*1024*1.44);
number = (int)(size/len);
if(size%len!=0)
number = number+1;
tfBlockNumber.setText(number+"");
}
if (e.getSource() == size2)
{
len = (int)(1.2*1024*1024);
number = (int)(size/len);
if(size%len!=0)
number = number+1;
tfBlockNumber.setText(number+"");
}
if (e.getSource() == size3)
{
len = 720*1024;
number = (int)(size/len);
if(size%len!=0)
number = number+1;
tfBlockNumber.setText(number+"");
}
if (e.getSource() == size4)
{
len = 360*1024;
number = (int)(size/len);
if(size%len!=0)
number = number+1;
tfBlockNumber.setText(number+"");
}
if (e.getSource() == size5)
{
if((!tfOtherSize.getText().isEmpty())&&size5.isSelected())
{
String s = tfOtherSize.getText();
len = Integer.parseInt(s)*1024;
number = (int)(size/len);
if(size%len!=0)
number = number+1;
tfBlockNumber.setText(number+"");
}
}
}
}
/*切割文件类*/
private class doCut extends Thread
{
public void run()
{
try
{
FileInputStream fis = new FileInputStream(name1);
byte[] buf = new byte[len];
int flag = fis.read(buf);
while(flag>0)
{
for(int i = 0;i<number;i++)
{
File outFile = new File(name2+"/"+"part"+(i+1)+filename);
FileOutputStream fos = new FileOutputStream(outFile);
fos.write(buf,0,flag);
flag = fis.read(buf);
fos.close();
int progress=100/number*(i+1);
pbj.setValue(progress);
pbj.setString(progress+"%");
}
}
pbj.setValue(100);
pbj.setString(100+"%");
fis.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
}
/*文件合并标签面板*/
class FileMergePanel extends JPanel
{
/*私有化定义组件*/
private JLabel laName = new JLabel("File Name: ");
private JLabel laShowMerge = new JLabel("File to be merged ");
private JLabel laFileNumber = new JLabel("Number of files:");
private JLabel laTargetFile = new JLabel("Target file:");
private JTextField tfName = new JTextField();
private JTextField tfTargetFile = new JTextField();
private JTextField tfFileNumber = new JTextField();
private JButton button1 = new JButton("...");
private JButton button2 = new JButton("...");
private JButton buRemove = new JButton("Remove");
private JButton buClear = new JButton("Clear");
private JButton buStart = new JButton("Start merging");
private java.awt.List list = new java.awt.List();
private JProgressBar pbj = new JProgressBar();
private String name1;
private String name2;
private int number = 0;
/*构造函数*/
public FileMergePanel()
{
setLayout(null);
add(laName);
add(tfName);
tfName.setEditable(false);
button1.addActionListener(new FileOpenListener());
add(button1);
add(laShowMerge);
add(list);
add(laFileNumber);
add(tfFileNumber);
tfFileNumber.setEditable(false);
add(buRemove);
buRemove.addActionListener(new FileOpenListener());
add(buClear);
buClear.addActionListener(new FileOpenListener());
add(laTargetFile);
add(tfTargetFile);
tfTargetFile.setEditable(false);
add(button2);
button2.addActionListener(new FileOpenListener());
add(buStart);
buStart.addActionListener(new FileOpenListener());
pbj.setValue(0);
pbj.setStringPainted(true);
add(pbj);
/*绝对坐标添加组件*/
buClear.setBounds(270,300,80,20);
button2.setBounds(360,330,40,20);
buStart.setBounds(20,360,120,20);
laTargetFile.setBounds(20,330,100,20);
tfTargetFile.setBounds(120,330,220,20);
button1.setBounds(360, 17, 40, 20);
list.setBounds(25,80,370,170);
buRemove.setBounds(120,300,80,20);
tfFileNumber.setBounds(120,270,100,20);
laFileNumber.setBounds(20,270,100,20);
laShowMerge.setBounds(20, 50, 100, 20);
tfName.setBounds(90, 17, 250, 20);
laName.setBounds(20, 17, 100, 20);
pbj.setBounds(170,360,200,20);
}
/*监听器内部类*/
private class FileOpenListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
if (e.getSource() == button1)
{
int result = chooser.showOpenDialog(null);
if(JFileChooser.CANCEL_OPTION!=result)
{
name1 = chooser.getSelectedFile().getPath();
tfName.setText(name1);
list.add(name1);
number = number+1;
tfFileNumber.setText(number+"");
}
}
if (e.getSource() == button2)
{
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = chooser.showSaveDialog(null);
if(JFileChooser.CANCEL_OPTION!=result)
{
name2 = chooser.getSelectedFile().getPath();
tfTargetFile.setText(name2);
}
}
if (e.getSource() == buClear)
{
tfName.setText("");
list.removeAll();
number = 0;
tfFileNumber.setText(number+"");
}
if (e.getSource() == buRemove)
{
int x = list.getSelectedIndex();
if(x>=0)
{
list.remove(x);
number = number-1;
tfFileNumber.setText(number+"");
}
}
if(e.getSource()==buStart)
{
if(number!=0)
{
doMerge r =new doMerge();
r.start();
}
else
System.out.println("非法操作,无法合并!");
}
}
}
private class doMerge extends Thread/*合并文件类*/
{
public void run()
{
try
{
String[] a = list.getItems();
File outFile = new File(name2+"/"+"合并文件");
FileOutputStream fos = new FileOutputStream(outFile);
for(int i = 0;i<a.length;i++)
{
FileInputStream fis = new FileInputStream(a[i]);
File inFile = new File(a[i]);
int size = (int)(inFile.length());
byte[] buf = new byte[size];
int flag = fis.read(buf);
while(flag>0)
{
fos.write(buf,0,flag);
flag = fis.read(buf);
int progress=100/number*(i+1);
pbj.setValue(progress);
pbj.setString(progress+"%");
}
}
fos.close();
pbj.setValue(100);
pbj.setString(100+"%");
}
catch(Exception e)
{
System.out.println(e);
}
}
}
}
我的这个文件切割感觉和用户需要使用的还是有很长一段距离的,不过感觉java语言的确挺好用