`
firecool
  • 浏览: 83832 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

文件拷贝工具

    博客分类:
  • java
阅读更多

package jp.swtech;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.util.Date;

import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class FileCopyTool extends JFrame {
    
    private static final long serialVersionUID = -2279866387292940681L;

    private String pathDest = "";
    
    private String pathSrc = "";
    
    private DefaultListModel model = null;
    
    public FileCopyTool(){
        super();
        setSize(250,400);
        initComponents();
    }
    
    private void initComponents(){
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBounds(10, 10, 10, 10);
        JLabel lblDest = new JLabel("目标路径:");
        txtDest = new JTextField(30);
        btnClear = new JButton("清空");
        btnClear.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
               File[] fs = new File(pathDest).listFiles();
               for(File f : fs){
                   f.delete();
               }
            }});
        btnCopy = new JButton("拷贝");
        btnCopy.addActionListener(new BtnCopyAction());
        Box box = Box.createHorizontalBox();
        box.add(lblDest);
        box.add(Box.createHorizontalStrut(5));
        box.add(txtDest);
        box.add(Box.createHorizontalStrut(5));
        box.add(btnClear);
        box.add(btnCopy);
        panel.add(box,BorderLayout.NORTH);
        
        JLabel lblSrc = new JLabel("源路径:");
        txtSrc = new JTextField(30);
        btnLoad = new JButton("加载文件");
        btnLoad.addActionListener(new BtnLoadAction());
        box = Box.createHorizontalBox();
        box.add(lblSrc);
        box.add(Box.createHorizontalStrut(5));
        box.add(txtSrc);
        box.add(Box.createHorizontalStrut(5));
        box.add(btnLoad);
        panel.add(box,BorderLayout.SOUTH);
        
        model = new DefaultListModel();
        fileList = new JList(model);
        fileList.addListSelectionListener(new SelectionListener());
        panel.add(new JScrollPane(fileList),BorderLayout.CENTER);
        add(panel);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
        SwingUtilities.updateComponentTreeUI(this);
    }
    
    private class SelectionListener implements ListSelectionListener{

        public void valueChanged(ListSelectionEvent e) {
            JList lst = (JList)e.getSource();
            pathSrc = txtSrc.getText().trim() + File.separator + lst.getSelectedValue();
            System.out.println("当前拷贝路径" + pathSrc);
        }
    }
    
    private class BtnLoadAction implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            try {
                model.removeAllElements();
                pathDest = txtDest.getText().trim();
                pathSrc = txtSrc.getText().trim();
                if(checked()){
                    File file = new File(pathSrc);
                    File[] files = file.listFiles();
                    for(File f : files)
                        model.addElement(f.getName());
                }
            } catch (Exception e1) {
                show("读取源目录发生异常!");
            }
        }
        
    }
    
    private class BtnCopyAction implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            if(checked()){
                try {
                    for(File f : new File(pathDest).listFiles()){
                        if(f.isFile()) f.delete();
                    }
                    File fs = new File(pathSrc);
                    if(fs.isFile()){
                        File toFile = new File(pathDest + File.separator + fs.getName());
                        forImage(fs,toFile);
                        return;
                    }
                    File[] files = fs.listFiles();
                    for(File f : files){
                        if(!f.isFile()) return;
                        File toFile = new File(pathDest + File.separator + f.getName());
                        forImage(f,toFile);
                    }
                    show("复制文件成功!");
                } catch (Exception e1) {
                    show("复制文件的时候发生异常!");
                }
            }
        }
        
    }
    
    private boolean checked(){
        if(pathDest.equals("")){
            show("目标路径不能为空");
            return false;
        }
        if(pathSrc.equals("")){
            show("源路径不能为空");
            return false;
        }
        return true;
    }
    
    private void show(String msg){
        JOptionPane.showMessageDialog(this, msg,"错误",JOptionPane.ERROR_MESSAGE);
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        FileCopyTool fct = new FileCopyTool();
        fct.setVisible(true);
    }
    
    public static long forImage(File f1, File f2) throws Exception {
        long time = new Date().getTime();
        int length = 2097152;
        FileInputStream in = new FileInputStream(f1);
        RandomAccessFile out = new RandomAccessFile(f2, "rw");
        FileChannel inC = in.getChannel();
        MappedByteBuffer outC = null;
        MappedByteBuffer inbuffer = null;
        byte[] b = new byte[length];
        while (true) {
            if (inC.position() == inC.size()) {
                inC.close();
                outC.force();
                out.close();
                return new Date().getTime() - time;
            }
            if ((inC.size() - inC.position()) < length) {
                length = (int) (inC.size() - inC.position());
            } else {
                length = 20971520;
            }
            b = new byte[length];
            inbuffer = inC.map(MapMode.READ_ONLY, inC.position(), length);
            inbuffer.load();
            inbuffer.get(b);
            outC = out.getChannel().map(MapMode.READ_WRITE, inC.position(), length);
            inC.position(b.length + inC.position());
            outC.put(b);
            outC.force();
            out.close();
            in.close();
        }
    } 


    JButton btnCopy = null;
    JTextField txtDest = null;
    JTextField txtSrc = null;
    JList fileList = null;
    JButton btnLoad = null;
    JButton btnClear = null;
}
 
分享到:
评论

相关推荐

    大名鼎鼎的小文件拷贝工具

    为了应对这一挑战,微软公司开发了“大名鼎鼎的小文件拷贝工具”,利用先进的多线程技术,显著提升了拷贝速度,成为了IT专业人士不可或缺的工具之一。 多线程拷贝速度的提升并非无中生有,而是有着深厚的计算机科学...

    fastcopy日本最快文件拷贝工具

    Fastcopy是日本的最快的文件拷贝工具。磁盘间相互拷贝文件是司空见惯的事情,通常情况都是利用WINDOWS自带的复制粘贴功能来实现的。这样做在数目较小的情况下倒也没什么问题,但是数目较大时,系统自带的复制功能就...

    QT开发基于QT开发的文件拷贝工具.zip

    QT开发基于QT开发的文件拷贝工具.zipQT开发基于QT开发的文件拷贝工具.zipQT开发基于QT开发的文件拷贝工具.zipQT开发基于QT开发的文件拷贝工具.zipQT开发基于QT开发的文件拷贝工具.zipQT开发基于QT开发的文件拷贝工具...

    FastCopy大文件拷贝工具

    《FastCopy:高效大文件拷贝工具的深度解析》 在日常的工作与生活中,我们时常需要将大量的数据从一个存储设备复制到另一个设备,尤其是在处理大型文件或文件夹时,Windows自带的拷贝功能往往显得力不从心,速度慢...

    一个不错的文件拷贝工具

    标题中的“一个不错的文件拷贝工具”指的是一个高效、便捷的文件复制软件,它能够帮助用户快速、稳定地将文件从一个位置复制到另一个位置。这类工具通常比操作系统自带的文件复制功能更加强大,提供了更多的选项和...

    最快的文件拷贝工具(每秒20MB)

    "最快的文件拷贝工具(每秒20MB)"这个标题所指的工具显然强调了其在速度方面的优势,能够实现每秒20MB的拷贝速率。这在处理大量数据或者需要频繁转移文件的场景下显得尤为关键,因为它大大提高了工作效率,减少了等待...

    系统文件拷贝工具

    系统文件拷贝工具是一种专为IT专业人士设计的实用软件,其主要功能是高效、安全地复制和移动系统中的隐藏文件及重要数据。这类工具通常具备高级功能,如自动识别系统文件、忽略权限问题以及在操作过程中保持文件完整...

    我用过的最快的文件拷贝工具

    标题中的“我用过的最快的文件拷贝工具”指的是在众多文件传输软件中,有一款工具在作者的使用体验中表现出极高的速度和效率。描述中的“至今为止,我用过的最快的文件拷贝工具,绝不忽悠”进一步强调了该工具的速度...

    FastCopy文件拷贝工具

    经测试,一个424MB的电影其拷贝时间仅为 21 秒,传输速度达到了21MB/秒,不知比TotalCopy之流快了多少倍,所以,在这里我不吝惜自己的赞美,把“最快的文件拷贝工具”这个桂冠送给它,如果你发现还有比它更快的,烦...

    VB版U盘文件拷贝工具uFileSys

    【VB版U盘文件拷贝工具uFileSys】是一款基于Visual Basic(VB)开发的实用程序,主要用于方便用户快速地将文件从一个位置复制到U盘或其他存储设备上。同时,该工具还具备文件监控功能,可以跟踪并记录文件的拷贝活动...

    大文件快速拷贝工具

    尤其是在处理大型文件,如高清视频、大型数据库和多媒体档案时,传统的文件拷贝方法往往因为效率低下而无法满足需要。为了应对这一挑战,软件开发者们研发出了一系列"大文件快速拷贝工具"。这类工具通过优化文件传输...

    硬盘文件拷贝工具

    硬盘写入数据,无损工具,确保copy的数据完全没有变化

    最快的文件拷贝工具 FastCopy_v1.52

    而FastCopy,作为一个专业的文件拷贝工具,以其高效、稳定和易用的特点,为用户节省了宝贵的时间,极大地提升了工作效率。 FastCopy_v1.52是这款软件的最新版本,它以其全中文的操作界面,为国内用户提供了极大的...

    fastcopy文件拷贝工具

    这时,一款高效、稳定的文件拷贝工具就显得尤为重要。Fastcopy,作为一款备受赞誉的文件拷贝软件,因其出色的性能和易用性,成为了许多用户的选择。 Fastcopy,顾名思义,其核心功能就是快速复制文件。它采用了优化...

    文件拷贝工具FastCopy1.71源代码

    FastCopy,作为一款备受赞誉的单机文件拷贝工具,以其高效、稳定的特点,在IT领域内享有极高的声誉。其1.71版本的源代码公开,为开发者提供了深入理解其工作原理的宝贵机会。本文将详细介绍FastCopy的核心功能以及源...

    一个多线程文件拷贝工具的实现(使用内存映射文件)

    一个多线程的文件拷贝工具的实现,文件操作接口使用了内存映射模型的方式实现,可以指定线程数量,可以在拷贝过程中查看整体的进度信息(进度、速度、剩余时间、已用时间),同时可以查看每个子线程对应的进度信息。...

    文件拷贝工具FastCopy

    FastCopy是一款高效、轻量级的文件拷贝工具,尤其在大量数据传输和备份场景下表现出色。它以其快速的拷贝速度和稳定的性能而受到用户的喜爱,是IT专业人士和普通用户进行文件管理的重要助手。 首先,让我们了解一下...

Global site tag (gtag.js) - Google Analytics