import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import javax.swing.text.*;
import javax.swing.event.*;
public class Application1 extends JFrame {
String filepath="";
JLabel splitSourceSize,coalitionTotalSize,coalitionTotalCount;
JTextField SplitSource,SplitTotalCount,SplitEachSize,coalitionSource;
//*****************************************申明结束
public Application1() {
super("工具");
this.setSize(640,480);
this.setLocation(this.getToolkit().getScreenSize().width/2-this.getWidth()/2,this.getToolkit().getScreenSize().height/2-this.getHeight()/2);
JPanel contentPanel=(JPanel)this.getContentPane();
contentPanel.setLayout(new BorderLayout());
JTabbedPane jtp=new JTabbedPane();
jtp.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
JPanel splitPane=new JPanel(new GridLayout(5,1));
JPanel splitPane0=new JPanel(new BorderLayout());
splitPane0.add(splitPane,BorderLayout.NORTH);
JPanel splitPane1=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel splitPane2=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel splitPane3=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel splitPane4=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel splitPane5=new JPanel();
splitPane1.add(new JLabel("拆分源文件:"));
SplitSource=new JTextField(40);
splitPane1.add(SplitSource);
JButton SplitJButton=new JButton("浏览...");
SplitJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SplitJButtonClick(e);//选择要拆分的文件
}
});
splitPane1.add(SplitJButton);
splitSourceSize=new JLabel("源文件大小:");
splitPane2.add(splitSourceSize);
splitPane3.add(new JLabel("拆分的数目:"));
SplitTotalCount=new JTextField(15);
SplitTotalCount.setDocument(new NumberDocument());//限制输入框只能输入数字
SplitTotalCount.getDocument().addDocumentListener(new DocumentListener() {//给输入框添加事件
public void changedUpdate(DocumentEvent e) {
if(!Application1.this.SplitTotalCount.isFocusOwner())return;
try{SplitTotalCount_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
public void insertUpdate(DocumentEvent e) {
if(!Application1.this.SplitTotalCount.isFocusOwner())return;
try{SplitTotalCount_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
public void removeUpdate(DocumentEvent e) {
if(!Application1.this.SplitTotalCount.isFocusOwner())return;
try{SplitTotalCount_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
});
splitPane3.add(SplitTotalCount);
splitPane4.add(new JLabel("单文件大小:"));
SplitEachSize=new JTextField(15);
SplitEachSize.setDocument(new NumberDocument());//限制输入框只能输入数字
SplitEachSize.getDocument().addDocumentListener(new DocumentListener() {//给输入框添加事件
public void changedUpdate(DocumentEvent e) {
if(!Application1.this.SplitEachSize.isFocusOwner())return;
try{SplitEachSize_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
public void insertUpdate(DocumentEvent e) {
if(!Application1.this.SplitEachSize.isFocusOwner())return;
try{SplitEachSize_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
public void removeUpdate(DocumentEvent e) {
if(!Application1.this.SplitEachSize.isFocusOwner())return;
try{SplitEachSize_changedUpdate(e);}catch(Exception ex){System.err.println(ex.toString());}
}
});
splitPane4.add(SplitEachSize);
JButton SplitJB=new JButton("开始拆分");
SplitJB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try{SplitJBClick(e);}catch(Exception ex){System.err.println(ex.toString());}//拆分文件
}
});
splitPane5.add(SplitJB);
splitPane.add(splitPane1);
splitPane.add(splitPane2);
splitPane.add(splitPane3);
splitPane.add(splitPane4);
splitPane.add(splitPane5);
JPanel coalitionPane0=new JPanel(new BorderLayout());
JPanel coalitionPane=new JPanel(new GridLayout(4,1));
coalitionPane0.add(coalitionPane,BorderLayout.NORTH);
JPanel coalitionPane1=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel coalitionPane2=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel coalitionPane3=new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel coalitionPane4=new JPanel();
coalitionPane1.add(new JLabel("合并首文件:"));
coalitionSource=new JTextField(40);
coalitionPane1.add(coalitionSource);
JButton coalitionJButton=new JButton("浏览(*.000)");
coalitionJButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
coalitionJButtonClick(e);//选择要合并的首文件
}
});
coalitionPane1.add(coalitionJButton);
coalitionPane.add(coalitionPane1);
coalitionTotalSize=new JLabel("文件总大小:");
coalitionPane2.add(coalitionTotalSize);
coalitionPane.add(coalitionPane2);
coalitionTotalCount=new JLabel("文件总数目:");
coalitionPane3.add(coalitionTotalCount);
coalitionPane.add(coalitionPane3);
JButton coalitionJB=new JButton("开始合并");
coalitionJB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try{coalitionJBClick(e);}catch(Exception ex){System.err.println(ex.toString());}//合并文件
}
});
coalitionPane4.add(coalitionJB);
coalitionPane.add(coalitionPane4);
jtp.add("拆分文件",splitPane0);
jtp.add("合并文件",coalitionPane0);
contentPanel.add(jtp,BorderLayout.CENTER);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);//当关闭窗口时退出系统
}
});
this.setVisible(true);
//********************************************以上为图形界面设计
}
private void SplitJBClick(ActionEvent e) throws Exception {//拆分文件操作
File file=new File(this.SplitSource.getText());
if(!file.exists()) {
JOptionPane.showMessageDialog(this,"源文件不存在!","警告",JOptionPane.WARNING_MESSAGE);
return;
}
javax.swing.JFileChooser fjc;
fjc=new javax.swing.JFileChooser(filepath);
fjc.removeChoosableFileFilter(fjc.getAcceptAllFileFilter());
fjc.setDialogTitle("选择保存目录");
fjc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if(fjc.APPROVE_OPTION!=fjc.showOpenDialog(this))return;
filepath=fjc.getSelectedFile().getPath();
byte[] b=new byte[1024];
int read=0;
String splitfilename=file.getName();
int eachfilesize=Integer.parseInt(this.SplitEachSize.getText());
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos;
String savesplitfilename="";
for(long splitcount=0;splitcount<Long.parseLong(this.SplitTotalCount.getText());splitcount++) {
savesplitfilename=fjc.getSelectedFile()+"/"+splitfilename+".xiruo.";
if(String.valueOf(splitcount).length()==1)
savesplitfilename+="00"+splitcount;
else if(String.valueOf(splitcount).length()==2)
savesplitfilename+="0"+splitcount;
else
savesplitfilename+=splitcount;
fos=new FileOutputStream(savesplitfilename);
int eachread=b.length;
int hasread=0;
while((read=fis.read(b,0,eachread))>0) {
fos.write(b,0,read);
fos.flush();
hasread+=read;
if(hasread>=eachfilesize&&splitcount!=Long.parseLong(this.SplitTotalCount.getText())-1)
break;
if(eachfilesize-hasread<(long)b.length)
eachread=eachfilesize-hasread;
}
fos.close();
}
fos=null;
JOptionPane.showMessageDialog(this,"拆分完成");
}
private void coalitionJBClick(ActionEvent e) throws Exception {//合并文件操作
File file=new File(this.coalitionSource.getText());
if(!file.exists()) {
JOptionPane.showMessageDialog(this,"源文件不存在!","警告",JOptionPane.WARNING_MESSAGE);
return;
}
javax.swing.JFileChooser fjc;
fjc=new javax.swing.JFileChooser(filepath);
fjc.setDialogTitle("选择保存目录");
fjc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if(fjc.APPROVE_OPTION!=fjc.showOpenDialog(this))return;
filepath=fjc.getSelectedFile().getPath();
String selfilename=file.getName();
selfilename=selfilename.substring(0,selfilename.lastIndexOf("."));
String savefile=fjc.getSelectedFile().getAbsolutePath()+"/"+selfilename.substring(0,selfilename.lastIndexOf("."));
if(new File(savefile).exists()) {
int javaok=JOptionPane.showConfirmDialog(this,"文件名 "+new File(savefile).getName()+" 的文件已经存在,你要覆盖原来的文件吗?","警告!",JOptionPane.OK_CANCEL_OPTION);
if(javaok==JOptionPane.CANCEL_OPTION)return;
}
byte[] b=new byte[1024];
int read=0;
FileOutputStream fos=new FileOutputStream(savefile);
FileInputStream fis;
File[] f=file.getParentFile().listFiles();
for(int i=0;i<f.length;i++) {
if(!f[i].getName().startsWith(selfilename))continue;
fis=new FileInputStream(f[i]);
while((read=fis.read(b,0,b.length))>0) {
fos.write(b, 0, read);
fos.flush();
}
fis.close();
}
fos.close();
fos=null;
fis=null;
JOptionPane.showMessageDialog(this,"合并完成");
}
private void SplitTotalCount_changedUpdate(DocumentEvent e) throws Exception {
File file=new File(this.SplitSource.getText());
if(!file.exists()||this.SplitTotalCount.getText().equals(""))return;
long l=Long.parseLong(this.SplitTotalCount.getText());
if(l<=0)return;
this.SplitEachSize.setText(String.valueOf(file.length()/l));
}
private void SplitEachSize_changedUpdate(DocumentEvent e) throws Exception {
File file=new File(this.SplitSource.getText());
if(!file.exists()||this.SplitEachSize.getText().equals(""))return;
double l=Double.parseDouble(this.SplitEachSize.getText());
if(l<=0)return;
this.SplitTotalCount.setText(fileCount((double)file.length(),l));
}
private void SplitJButtonClick(ActionEvent e) {//选择要拆分的源文件
javax.swing.JFileChooser fjc;
fjc=new javax.swing.JFileChooser(filepath);
fjc.addChoosableFileFilter(new myFilter("*.jpg,*.gif","jpg,gif Files(*.jpg,*.gif)"));//文件过滤
fjc.addChoosableFileFilter(new myFilter("*.rm,*.rmvb","real Files(*.rm,*.rmvb)"));//文件过滤
fjc.addChoosableFileFilter(new myFilter("*.mpg,*.mpeg","mpg Files(*.mpg,*.mpeg)"));//文件过滤
fjc.addChoosableFileFilter(fjc.getAcceptAllFileFilter());
if(fjc.APPROVE_OPTION!=fjc.showOpenDialog(this))return;
filepath=fjc.getSelectedFile().getPath();
File file=fjc.getSelectedFile();
double filesize=file.length();
String size="";
java.text.DecimalFormat df=new java.text.DecimalFormat("#.##");
if(filesize>=1024d*1024d*0.8d)
size=df.format(filesize/(1024d*1024d))+"MB";
else if(filesize>=1024d*0.8d)
size=df.format(filesize/1024d)+"KB";
else
size=filesize+"Bytes";
this.splitSourceSize.setText("源文件大小: "+size);
this.SplitSource.setText(file.getAbsolutePath());
this.SplitTotalCount.setText(fileCount(filesize,102400));
this.SplitEachSize.setText("102400");
}
private void coalitionJButtonClick(ActionEvent e) {//选择要合并的首文件
javax.swing.JFileChooser fjc;
fjc=new javax.swing.JFileChooser(filepath);
fjc.removeChoosableFileFilter(fjc.getAcceptAllFileFilter());//移除默认的select All
fjc.addChoosableFileFilter(new myFilter("*.xiruo.000","拆分首文件(*.xiruo.000)"));//文件过滤
if(fjc.APPROVE_OPTION!=fjc.showOpenDialog(this))return;
filepath=fjc.getSelectedFile().getPath();
File file=fjc.getSelectedFile();
String selfilename=file.getName();
this.coalitionSource.setText(file.getAbsolutePath());
selfilename=selfilename.substring(0,selfilename.lastIndexOf("."));
File[] f=file.getParentFile().listFiles();
double filesize=0;
int filetotalcount= 0;
for(int i=0;i<f.length;i++) {
if(!f[i].getName().startsWith(selfilename))continue;
filetotalcount++;
filesize+=f[i].length();
}
String size="";
java.text.DecimalFormat df=new java.text.DecimalFormat("#.##");
if(filesize>=1024d*1024d*0.8d)
size=df.format(filesize/(1024d*1024d))+"MB";
else if(filesize>=1024d*0.8d)
size=df.format(filesize/1024d)+"KB";
else
size=filesize+"Bytes";
this.coalitionTotalSize.setText("文件总大小: "+size);
this.coalitionTotalCount.setText("文件总数目: "+filetotalcount);
}
private String fileCount(double filesize,double eachsize) {
int i=(int)(filesize/eachsize)+(filesize%eachsize>0?1:0);
return String.valueOf(i);
}
public class NumberDocument extends PlainDocument {//对文本框的输入进行输入限制,构造PlainDocument实现
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
char[] source = str.toCharArray();
char[] result = new char[source.length];
int j = 0;
for (int i = 0; i < result.length; i++) {
if (Character.isDigit(source[i]))
result[j++] = source[i];
}
super.insertString(offs, new String(result, 0, j), a);
}
}
public static void main(String args[]) throws Exception {
Font font=new Font("宋体",Font.PLAIN,15);
UIManager.put("Button.font",font);
UIManager.put("ToggleButton.font",font);
UIManager.put("RadioButton.font",font);
UIManager.put("CheckBox.font",font);
UIManager.put("ColorChooser.font",font);
UIManager.put("ToggleButton.font",font);
UIManager.put("ComboBox.font",font);
UIManager.put("ComboBoxItem.font",font);
UIManager.put("InternalFrame.titleFont",font);
UIManager.put("Label.font",font);
UIManager.put("List.font",font);
UIManager.put("MenuBar.font",font);
UIManager.put("Menu.font",font);
UIManager.put("MenuItem.font",font);
UIManager.put("RadioButtonMenuItem.font",font);
UIManager.put("CheckBoxMenuItem.font",font);
UIManager.put("PopupMenu.font",font);
UIManager.put("OptionPane.font",font);
UIManager.put("Panel.font",font);
UIManager.put("ProgressBar.font",font);
UIManager.put("ScrollPane.font",font);
UIManager.put("Viewport",font);
UIManager.put("TabbedPane.font",font);
UIManager.put("TableHeader.font",font);
UIManager.put("TextField.font",font);
UIManager.put("PasswordFiled.font",font);
UIManager.put("TextArea.font",font);
UIManager.put("TextPane.font",font);
UIManager.put("EditorPane.font",font);
UIManager.put("TitledBorder.font",font);
UIManager.put("ToolBar.font",font);
UIManager.put("ToolTip.font",font);
UIManager.put("Tree.font",font);//以上设置是为了解决中文问题
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//设置可视风格
new Application1();
}
}
//************************************************文件选择过滤器
class myFilter extends javax.swing.filechooser.FileFilter {
String extension="",description="";
public myFilter(String extension,String description) {
if(extension!=null)this.extension=extension;
if(description!=null)this.description=description;
}
public String getDescription() {
return this.description;
}
public boolean accept(File file) {
if(file.isDirectory()||extension.equals(""))
return true;
String[] s=extension.replaceAll("[*]","").split("[,]");
for(int i=0;i<s.length;i++) {
if(file.getName().toLowerCase().endsWith(s[i].toLowerCase())) {
return true;
}
}
return false;
}
}