`
hcmfys
  • 浏览: 356229 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA 复制 带进度条 时间 百分比

    博客分类:
  • java
阅读更多

 写得不太好。如果喜欢就下载
/**
 * @(#)JprogressBar.java
 * it can copy file
 * show speed remail time and copy precent      
 * @author hcmfys
 * @version 1.00 2008/5/9
 *把我们的智慧献给全人类
 */

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class JprogressBar extends JFrame implements Runnable {

    public JprogressBar() {
        initUI();
    }

    private void initUI() {
        btCopy = new JButton("open file....");
        JButton btCancel = new JButton("cancel");
        JButton btSavePath = new JButton("save Path...");
        copyFileProgressBar = new JProgressBar(0, 100);
        copyFileProgressBar.setPreferredSize(new Dimension(450, 15));
        copyFileProgressBar.setBackground(Color.GREEN);
        copyFileProgressBar.setForeground(Color.PINK);
        copyFileProgressBar.setStringPainted(true);
        copyFileProgressBar.setVisible(false);
        openFileDialog = new JFileChooser(".");
        this.setLayout(new BorderLayout());
        JPanel tmpPanel1 = new JPanel();
        JPanel tmpPanel2 = new JPanel();
        btCopy.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Thread t = new Thread(JprogressBar.this);
                t.start();
            }

        });
        btSavePath.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                savePath = setSavePath();
            }
        });
        btCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                stop = true;
                btCopy.setEnabled(true);
            }
        });
        tmpPanel1.add(btCopy);
        tmpPanel1.add(btSavePath);
        tmpPanel1.add(btCancel);
        tmpPanel2.add(copyFileProgressBar);
        this.add(tmpPanel1, BorderLayout.NORTH);
        this.add(tmpPanel2, BorderLayout.SOUTH);
        this.setTitle("read and copy file");
        this.setPreferredSize(new Dimension(450, 95));
        this.pack();
        Dimension cd = centerIt(this);
        this.setLocation(cd.width, cd.height);
        final Dimension des = this.getPreferredSize();
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                stop = true;
                System.exit(0);
            }

            public void windowStateChanged(WindowEvent e) {
                System.out.println("ss");
                if (e.paramString().equals("WINDOW_STATE_CHANGED")) {
                    System.out.println("ss");
                    JprogressBar.this.setSize(des);
                }
            }
        });
        this.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
              //  System.out.println("ss");
              //  JprogressBar.this.setSize(des);
            }

        });
    }

    /*
    * start read file..
    */
    public void run() {
        stop = false;
        int c = openFileDialog.showOpenDialog(this);
        if (c == JFileChooser.APPROVE_OPTION) {
            try {
                File selectFile = openFileDialog.getSelectedFile();
                if (selectFile.equals(savePath)) {
                    JOptionPane.showMessageDialog(this, "  \t target file and source file can't as the same !");
                    return;
                }
                if (savePath == null) {
                    JOptionPane.showMessageDialog(this, "  \t please select a path to save file !");
                    return;
                }
                btCopy.setEnabled(false);
                copyFileProgressBar.setVisible(true);
                long size = selectFile.length();
                copyFileProgressBar.setMaximum((int) size);
                FileInputStream fin = new FileInputStream(selectFile);
                FileOutputStream fout = new FileOutputStream(savePath);
                byte[] buff = new byte[1024];
                int s;
                int count = 0;
                long startTime = System.currentTimeMillis();
                while ((s = fin.read(buff)) > 0 && !stop) {
                    count += s;
                    fout.write(buff, 0, s);
                    String str = "" + 100 * (count / (size + 0.01));
                    str = forMatString(str);
                    long endTime = System.currentTimeMillis();
                    String speedStr = getSpeed(count, startTime, endTime);
                    String remailTime = getRemailTime(count, size, startTime, endTime);
                    copyFileProgressBar.setString(" precent:   " + str + " %" + "    speed: " + speedStr + "    " + " remail  time : " + remailTime);
                    copyFileProgressBar.setValue(count);
                }
                fin.close();
                fout.close();
                if (!stop) {
                    JOptionPane.showMessageDialog(this, "  \t copy file complete  !");
                }
                stop = true;
                savePath = null;
                btCopy.setEnabled(true);
                copyFileProgressBar.setValue(0);
                copyFileProgressBar.setString("");
                copyFileProgressBar.setVisible(false);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "err:\n" + ex.getMessage());
            }
        }
    }

    /*
    *select  save file path
    */
    private File setSavePath() {
        File path = null;
        int c = openFileDialog.showSaveDialog(this);
        if (c == JFileChooser.APPROVE_OPTION) {
            path = openFileDialog.getSelectedFile();
        }
        return path;
    }

    /*
    * make frame center
    */
    private Dimension centerIt(Component c) {
        Dimension size = c.getSize();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int sH = screenSize.height;
        int sW = screenSize.width;
        int cW = size.width;
        int cH = size.height;
        return new Dimension((sW - cW) / 2, (sH - cH) / 2);
    }

    /*
    * show copy file  speed
    */
    private String getSpeed(long readByte, long startTime, long endTime) {
        long speed;
        if (endTime - startTime != 0) {
            speed = (readByte / (endTime - startTime)) * 1000;
            if (speed > 1024 * 1024) {
                return forMatString(speed / (1024 * 1024 + 0.1) + "") + " m/s";
            } else if (speed > 1024) {
                return forMatString(speed / (1024 + 0.1) + "") + " k/s";
            } else {
                return speed + " b/s";
            }
        } else {
            return "0 b/s";
        }
    }

    /*
    * format string
    */
    private String forMatString(String str) {
        String values;
        int index = str.indexOf(".");
        values = str.substring(0, index + 3);
        return values;
    }

    /*
    * get remail time
    */
    private String getRemailTime(long readByte, long totalByte, long startTime, long endTime) {
        long hour;
        long minute;
        long second;
        String h;
        String m;
        String s;
        try {
            long speed = readByte / (endTime - startTime);
            long time = ((totalByte - readByte) / speed) / 1000;
            hour = time / 3600;
            minute = time % 3600 / 60;
            second = time % 3600 % 60;
            h = hour + "";
            m = minute + "";
            s = second + "";
            if (hour < 10) {
                m = "0" + minute;
            }
            if (minute < 10) {
                m = "0" + minute;
            }
            if (second < 10) {
                s = "0" + second;
            }
            return h + ":" + m + ":" + s;
        } catch (Exception ex) {
            return "00:00:00";
        }

    }

    /*
    * show frm
    */

    public static void main(String[] args) {
        JprogressBar frm = new JprogressBar();
        frm.setVisible(true);
    }

    /*
    *
    */
    private JButton btCopy;
    private JFileChooser openFileDialog;
    private JProgressBar copyFileProgressBar;
    private File savePath = null;
    private boolean stop = false;
}


分享到:
评论
2 楼 hcmfys 2012-10-11  
lonuery 写道
open file 是获取要进行复制的文件的地址,save Path 复制到那个地方的地址,但是我复制了你的代码,为什么我复制代码运行后却复制不了呢?搞不懂你的代码,注释太少了,看的蛋疼!


:o  没有那么严重把!
1 楼 lonuery 2012-08-12  
open file 是获取要进行复制的文件的地址,save Path 复制到那个地方的地址,但是我复制了你的代码,为什么我复制代码运行后却复制不了呢?搞不懂你的代码,注释太少了,看的蛋疼!

相关推荐

    带进度条的文件上传源代码

    具体到这个“带进度条的文件上传源代码”,它利用AJAX和DWR实现了一个动态更新的进度条,用户选择文件后,前端会立即显示一个进度条,展示文件上传的百分比。这个过程是通过监听HTTP请求的进度事件完成的,当服务器...

    在复制文件时显示进度条,用线程实现的

    1. **创建进度条**:在用户界面上创建一个进度条控件,可以是GUI应用程序中的ProgressBar,它可以显示复制过程中的百分比。 2. **启动工作线程**:创建一个新的线程,这个线程将执行文件复制的代码。工作线程需要...

    进度条的两种实现(有百分比和无百分比).zip

    有百分比的进度条适用于那些可以精确量化进度的情况,如数据库查询、文件复制等。在JSP中,你可以先在HTML部分定义一个带有百分比显示的进度条: ```html ...

    java实现的类似windows操作系统的xCopy

    5. **进度显示**:为了提高用户体验,可以考虑添加进度条或者百分比显示,这需要定时更新复制状态并打印到控制台。`System.out.println()` 或 `java.io.PrintStream` 可以用来输出信息。 6. **性能优化**:Java 中...

    进度条对话框

    进度条对话框通常包括一个可视化的进度条,显示任务完成的百分比,以及可能的文字信息,描述当前进行的操作或剩余时间。这种交互设计有助于提高用户体验,因为它们减少了用户的等待焦虑,让用户知道程序并没有卡住,...

    下载进度条显示,数据库,apk 安装.zip

    下载进度条通过图形化的方式展示文件下载的百分比,帮助用户了解当前操作的进度,减少用户等待的焦虑感,提升用户体验。实现这一功能通常需要在后台监控文件传输的字节数,并与总文件大小进行比较,计算出对应的完成...

    android 进度条之numberprogressbar

    `NumberProgressBar`则同时显示了进度条和当前的数值,使得用户能够快速知道进度的百分比或者具体数值。 实现`NumberProgressBar`需要对Android的自定义View有深入理解。通常,我们需要继承自`ProgressBar`类,重写...

    java-poi-excel-导出20万条记录【源代码】

    同时,为了提供用户体验,可以展示进度条或百分比完成,让用户知道导出的进度。 综上所述,处理20万条记录的Excel导出需要对Java、Apache POI、数据库查询以及性能优化有深入的理解。通过合理利用SXSSFWorkbook,...

    java 递归拷贝文件显示进度demo

    可能的实现方式是在每次成功拷贝一个文件后,增加一个计数器或者累加文件大小,然后根据这个比例更新进度条或百分比。这通常需要一个同步机制来保证多线程环境下的正确性。 5. **异常处理**: 文件操作可能抛出...

    完整版自定义进度复制文件例子.rar

    9. 用户界面(UI)设计:除了核心的复制逻辑,一个好的UI设计能让用户更直观地了解复制状态,如通过百分比、进度条、动画等形式展示。 总结,这个压缩包提供的示例可能涵盖了以上所述的多个方面,包括文件复制、...

    进度状态栏

    确定性进度条显示确切的进度,比如文件复制的百分比;而不确定性进度条,如旋转的沙漏或加载环,表示任务在进行中,但无法提供具体完成的百分比。 在状态栏中集成进度条,需要考虑以下几个设计要点: 1. **空间...

    完整版进度复制文件模块代码和例子.rar

    它通过跟踪复制过程中的字节传输,计算已复制部分占总大小的比例,并显示为百分比或其他形式的进度条。这通常涉及到多线程或异步处理,以确保用户界面的响应性不会因为文件复制操作而受到影响。 在"进度复制文件...

    ArcTune:弧形动画进度条

    - **集成到项目**:将ArcTune库导入Java项目中,通常通过添加依赖或复制源码到项目中。 - **初始化对象**:创建ArcTune实例,指定初始参数如最大进度值。 - **设置动画**:调用相应的API设置动画的起始和结束...

    Disk management.rar

    2. **实现原理**:通过计算已处理文件的数量或已传输的数据量,与总文件数量或总数据量做比较,计算出百分比,然后根据这个百分比更新进度条的长度或位置。 3. **编程实现**:在C#、Python、Java等编程语言中,可以...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    FileCopy(1)

    在此代码中,我们计算已读取的字节数,并将其转换为百分比,更新进度条的值。这样,用户就可以看到文件复制的进度。 综上所述,结合FileHelper进行文件读写,利用Frame框架构建用户界面,以及在复制操作中添加...

    完整版读取文件并显示进度.rar

    实现进度条通常需要计算已处理文件的百分比,并将其转化为可视化界面元素。例如,在Python的Turtle库或wxPython等图形用户界面库中,可以创建进度条控件。 4. **多线程技术**:在读取大文件时,为了不影响用户的...

Global site tag (gtag.js) - Google Analytics