Savage F. Morgan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
package studio.sm.homework;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;

 

public class App_FileCopy implements ActionListener,Runnable
{
    JFrame frame;
    JProgressBar progressbar;
    JCheckBox jChkBox;
    Timer timer;
    JButton btn;
    
       File file_src;
       File file_des_folder;
       
       Thread thread;
 
    public App_FileCopy() {

       frame = new JFrame("App_FileCopier");
       frame.setBounds(300, 300, 400, 130);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setResizable(false);
       Container contentPanel = frame.getContentPane();
       progressbar = new JProgressBar();
       progressbar.setOrientation(JProgressBar.HORIZONTAL);
       //progressbar.setMinimum(0);
       //progressbar.setMaximum(100);
       //progressbar.setValue(0);
       progressbar.setStringPainted(true);
       //progressbar.setPreferredSize(new Dimension(300, 20));
       progressbar.setBorderPainted(true);

       JPanel panel = new JPanel();

       btn = new JButton("复制");
       btn.addActionListener(this);
       
       jChkBox = new JCheckBox("显示进度");
       jChkBox.setSelected(true);
       
       //--> jChkBox's ActionListener
       jChkBox.addActionListener(new ActionListener()
       {

        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            if(jChkBox.isSelected()) progressbar.setVisible(true);
            else progressbar.setVisible(false);
            
        }});
       
            
       panel.add(btn);
       panel.add(jChkBox);
       //timer = new Timer(100, this);

       contentPanel.add(panel, BorderLayout.NORTH);

       contentPanel.add(progressbar, BorderLayout.SOUTH);

       frame.setVisible(true);

    }

 

    public void actionPerformed(ActionEvent e) 
    {    
       if (e.getSource() == btn) 
       {
           
               JFileChooser file_src_chooser = new JFileChooser();
               file_src_chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
               
               JFileChooser folder_des_chooser = new JFileChooser();
               folder_des_chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
               
               file_src_chooser.setDialogTitle("请选择您要复制的文件");
               folder_des_chooser.setDialogTitle("请选择您要复制到的路径");
              
               int whichButton = file_src_chooser.showOpenDialog(null);
            if (whichButton == JFileChooser.APPROVE_OPTION)
            {  
                //path = file_src.getSelectedFile().getAbsolutePath();
                file_src = file_src_chooser.getSelectedFile();
                System.out.println("* Source file -> " + file_src.toString());
                System.out.println("* --> the src file's length is " + file_src.length() + " bytes");
                
                int whichBTN = folder_des_chooser.showOpenDialog(null);
                
                
                //--> okay, get everything done
                if(whichBTN == JFileChooser.APPROVE_OPTION)
                {
                    file_des_folder = folder_des_chooser.getSelectedFile();
                    System.out.println("* Destination -> " + file_des_folder.toString());
                    //fileCopy(file_src,file_des_folder);
                    
                    thread = new Thread(this);  
                    thread.start(); 
                }
                
                
                else if(whichBTN == JFileChooser.CANCEL_OPTION)
                {
                    System.out.println("* The user clicked button cancel on this DIRECTORY chooser dialog.");
                }
                
            }
            else if (whichButton == JFileChooser.CANCEL_OPTION)
            {
                System.out.println("* The user clicked button cancel on this FILE chooser dialog.");
            }
                   
       }
//       if (e.getSource() == timer) 
//       {
//           int value = progressbar.getValue();
//           if (value < 100)
//              progressbar.setValue(++value);
//           else 
//           {
//              timer.stop();
//              //frame.dispose();
//           }
//       }
    }

 
    public void fileCopy(File src,File des)  //--> runs in a thread
    {
        //long file_length = src.length();

        
        //System.out.println("* --> the src file's length is " + file_length + " bytes");
 //       if (file_length >= 100)
//        {
            //timer.start();
//            System.out.println("* --> src file is larger than 100 bytes");
//            progressbar.setMinimum(0);
//            progressbar.setMaximum((int)file_length);
//            progressbar.setValue(0);
 //       }
        
        
        File des_file = new File(des.toString() + File.separator + src.getName());
        System.out.println("* after combination,finally -> " + des_file.toString());
               
        try
        {
            BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(src)));
            BufferedOutputStream bos = new BufferedOutputStream(new DataOutputStream(new FileOutputStream(des_file)));
            
            byte[] readBytes = new byte[1024];
            
            int size = bis.available();
            System.out.println("* --> the size of the src file is " + size + " bytes");
            
            size = size - (size % 1024) + 1024; 
            float per = (float) (100 / (size / 1024.0)); 
            int i = 0;
            
            while (true)
            {  
                int len = bis.read(readBytes);  
                if (len == -1)
                {
                    progressbar.setValue(100);
                    JOptionPane.showMessageDialog(null, des_file.getName() + " 文件已经复制完成.");
                    progressbar.setValue(0);
                    break;
                }
                    
                bos.write(readBytes, 0, len);
                bos.flush();
                progressbar.setValue((int)(per * i ));  
                //progressBarPanel.addEvent(e);  
                i++;  
            }  
            
//            while ((length = bis.read(readBytes, 0, readBytes.length)) > 0) 
//            {          
//                
//                bos.write(readBytes, 0, length);
//                bos.flush();
//            }
                      
            System.out.println("* --> File copy completed.");
            bos.close();
            bis.close();
                        
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {

            e.printStackTrace();
        }      
    }
    
    
     
    public static void main(String[] args)
    {
        new App_FileCopy();
    }


    @Override
    public void run()
    {    
        fileCopy(file_src,file_des_folder);
        
    }
}

 

posted on 2012-12-22 19:46  罗斯摩根  阅读(230)  评论(0编辑  收藏  举报