java 文件切割与合并

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语言的确挺好用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值