如何在Java中将进度条添加到文件复制

时间:2013-12-30 23:44:06

标签: java

所以我有一个类用于将所有特定文件类型从一个目录复制到另一个目录。这个类确实有效,但我很好奇添加进度条的最佳方法是让用户知道复制所有文件的距离。
所以我的问题是,在这个课程中添加进度条的最佳方法是什么。正如您所看到的,此类没有任何GUI可用。

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;



public class CopyFilesFromType
{
    public static void main(File SourcePath, File DestPath)
    {
        new CopyFilesFromType().copy("tif", SourcePath.toString(),        DestPath.toString());
    }

    private FileTypeOrFolderFilter filter = null;


    private void copy(final String fileType, String fromPath, String outputPath)
    {
        filter = new FileTypeOrFolderFilter(fileType);
        File currentFolder = new File(fromPath);
        File outputFolder = new File(outputPath);
        scanFolder(fileType, currentFolder, outputFolder);
    }

    private void scanFolder(final String fileType, File currentFolder, File outputFolder)
    {
        System.out.println("Scanning folder [" + currentFolder + "]...");
        File[] files = currentFolder.listFiles(filter);
        for (File file : files) {
            if (file.isDirectory()) {
                scanFolder(fileType, file, outputFolder);
            } else {
                copy(file, outputFolder);
            }
        }
    }

    private void copy(File file, File outputFolder)
    {
        try {
            System.out.println("\tCopying [" + file + "] to folder [" + outputFolder + "]...");
            InputStream input = new FileInputStream(file);
            OutputStream out = new FileOutputStream(new File(outputFolder + File.separator + file.getName()));
            byte data[] = new byte[input.available()];
            input.read(data);
            out.write(data);
            out.flush();
            out.close();
            input.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private final class FileTypeOrFolderFilter implements FileFilter
    {
        private final String fileType;

        private FileTypeOrFolderFilter(String fileType)
        {
            this.fileType = fileType;
        }

        public boolean accept(File pathname)
        {
            return pathname.getName().endsWith("." + fileType) || pathname.isDirectory();
        }
    }
}

1 个答案:

答案 0 :(得分:4)

FileInputStream包裹在javax.swing.ProgressMonitorInputStream.