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

Aza*_*dov 0 java multithreading copy

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

//主类(接口):

public class Main extends JFrame{
    static JButton bt1, bt2, bt3;
    static JLabel lb1, lb2, lb3;
    static JTextField tf1;
    static int copyCount;
    eHandler handler = new eHandler();
    public static void main (String args[]){
        Main m = new Main("?????????");
        m.setVisible(true);
        m.setLocationRelativeTo(null);
        m.setSize(150, 100);
        m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        m.setResizable(false);
    }

    public Main(String s){
        super(s);
        setLayout (new GridLayout(3, 1, 1, 1));
        bt1 = new JButton("Open file");
        bt2 = new JButton("Copy file");
        tf1 = new JTextField(5);
        add(bt1);
        add(bt2);
        add(tf1);
        bt1.addActionListener(handler);
        bt2.addActionListener(handler);
    }
}

class eHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==Main.bt1){
            OpenFile op = new OpenFile();
            op.fileOpen();
        }

        if (e.getSource()==Main.bt2){
            Main.copyCount = Integer.parseInt(Main.tf1.getText());
            Copy cop = new Copy();
            cop.fileCopy();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

//打开文件的过程:

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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

//复制文件的过程:

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) {}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

arc*_*rcy 8

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

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

如果您确定这只会用于固态驱动器,则适用不同的参数.但事情并没有因为它们处于不同的线程而变得更快.

-

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