在java中使用线程复制文件的多个副本

在java中使用线程复制文件的多个副本,java,multithreading,copy,Java,Multithreading,Copy,我有一个简单的程序。她制作所选文件的多个副本。请向我解释一下,我如何使用线程来加速复制过程 //主类(接口): //打开文件的过程如下: public class OpenFile { JFileChooser chooser1; static File fileDat; static String fileName, filePath, fileFullPathName; public void fileOpen(){ try {

我有一个简单的程序。她制作所选文件的多个副本。请向我解释一下,我如何使用线程来加速复制过程

//主类(接口):

//打开文件的过程如下:

public class OpenFile {
    JFileChooser chooser1;
    static File fileDat;
    static String fileName, filePath, fileFullPathName;

    public void fileOpen(){
        try {
            chooser1 = new JFileChooser();
            chooser1.setCurrentDirectory(new File("."));
            chooser1.setDialogTitle("Выберите файл");
            chooser1.showOpenDialog(null);
            fileDat  = chooser1.getSelectedFile();
            fileName = fileDat.getName();
            filePath = fileDat.getParent();
            fileFullPathName = fileDat.getAbsolutePath();
        } catch (Exception e) {}
    }
}
public class Copy {
    static String copyfileFullPathName[];
    public void fileCopy(){
    copyfileFullPathName = new String [Main.copyCount];
        for(int i=0; i<Main.copyCount; i++){
            copyfileFullPathName [i] = OpenFile.filePath+"\\"+i+".txt";
            try {
                Files.copy(Paths.get(OpenFile.fileFullPathName), Paths.get(copyfileFullPathName [i]));
            } catch (IOException e) {}
        }
    }
}
//复制文件的过程如下:

public class OpenFile {
    JFileChooser chooser1;
    static File fileDat;
    static String fileName, filePath, fileFullPathName;

    public void fileOpen(){
        try {
            chooser1 = new JFileChooser();
            chooser1.setCurrentDirectory(new File("."));
            chooser1.setDialogTitle("Выберите файл");
            chooser1.showOpenDialog(null);
            fileDat  = chooser1.getSelectedFile();
            fileName = fileDat.getName();
            filePath = fileDat.getParent();
            fileFullPathName = fileDat.getAbsolutePath();
        } catch (Exception e) {}
    }
}
public class Copy {
    static String copyfileFullPathName[];
    public void fileCopy(){
    copyfileFullPathName = new String [Main.copyCount];
        for(int i=0; i<Main.copyCount; i++){
            copyfileFullPathName [i] = OpenFile.filePath+"\\"+i+".txt";
            try {
                Files.copy(Paths.get(OpenFile.fileFullPathName), Paths.get(copyfileFullPathName [i]));
            } catch (IOException e) {}
        }
    }
}
公共类副本{
静态字符串copyfileFullPathName[];
公共作废文件副本(){
copyfileFullPathName=新字符串[Main.copyCount];

对于(int i=0;i您可能无法使用多个线程来加快速度。文件的复制将是“i/O绑定的”,这意味着速度的限制因素是您可以将字节写入设备的速度。对于硬盘驱动器,这是一个串行操作;不同的线程不能同时执行此操作,一个线程必须等待磁盘自由写入(在磁盘上的不同位置)因此,至少不会有速度提升

事实上,这是一个典型的情况,即在试图改进的同时使事情变得更糟。由于最长的操作可能是磁盘将其读/写头放置在写入所需的位置上,因此将写入操作放在多个线程上可能会导致比单个线程更多的操作,因为单次写入操作f磁盘驱动程序可以优化较长的长度,使其比多次较短的操作更快

如果您确定这将只在固态驱动器上使用,那么将应用不同的参数。但事情不会因为它们在不同的线程中而变得更快

--

编辑:我想您可以研究使用更大的缓冲区来进行文件操作;有时这会加快速度