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

时间:2016-07-19 08:41:13

标签: java multithreading copy

我有一个简单的程序。她制作了所选文件的多个副本。请解释一下,我怎样才能通过使用线程来加快复制过程?

//主类(接口):

SynchronizationContext

//打开文件的程序:

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();
        }
    }
}

//复制文件的过程:

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) {}
    }
}

1 个答案:

答案 0 :(得分:7)

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

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

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

-

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