在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磁盘驱动程序可以优化较长的长度,使其比多次较短的操作更快
如果您确定这将只在固态驱动器上使用,那么将应用不同的参数。但事情不会因为它们在不同的线程中而变得更快
--
编辑:我想您可以研究使用更大的缓冲区来进行文件操作;有时这会加快速度