gpt4 book ai didi

java - 使用java中的线程进行文件的多个副本

转载 作者:行者123 更新时间:2023-12-01 07:02:30 25 4
gpt4 key购买 nike

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

//主类(接口(interface)):

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

//复制文件的过程:

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

最佳答案

您可能无法使用多个线程来加快速度。文件的复制将受到“I/O 限制”,这意味着速度的限制因素是向设备写入字节的速度。对于硬盘驱动器来说,这是一个串行操作;不同的线程不能同时执行此操作,一个线程必须等到磁盘空闲才能进行写入(在磁盘上的不同位置),因此至少不会提高速度。

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

如果您确定这只会在固态硬盘上使用,则适用不同的参数。但事情并不会因为它们位于不同的线程中而变得更快。

--

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

关于java - 使用java中的线程进行文件的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38453488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com