java 中如何用两个不加锁的线程,一个完成将文件夹S中的十个图片拷贝至文件夹D中,另一个将拷贝后的图片名从a1,a2,a3,....改为1,2,3....
时间: 2023-12-10 14:41:36 浏览: 23
可以使用 Java 的多线程技术来实现这个功能。以下是一个简单的实现方法:
```java
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CopyAndRenameImages {
public static void main(String[] args) {
// 创建两个线程,一个用于拷贝图片,一个用于重命名图片
Thread copyThread = new Thread(new CopyImagesTask());
Thread renameThread = new Thread(new RenameImagesTask());
// 启动线程
copyThread.start();
renameThread.start();
}
// 拷贝图片的任务
private static class CopyImagesTask implements Runnable {
@Override
public void run() {
File sourceFolder = new File("S"); // 源文件夹
File destFolder = new File("D"); // 目标文件夹
// 获取源文件夹中的所有图片文件
File[] imageFiles = sourceFolder.listFiles((dir, name) -> name.endsWith(".jpg") || name.endsWith(".png"));
// 拷贝图片文件到目标文件夹
for (File imageFile : imageFiles) {
try {
Path sourcePath = Paths.get(imageFile.getAbsolutePath());
Path destPath = Paths.get(destFolder.getAbsolutePath(), imageFile.getName());
Files.copy(sourcePath, destPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 重命名图片的任务
private static class RenameImagesTask implements Runnable {
@Override
public void run() {
File destFolder = new File("D"); // 目标文件夹
// 获取目标文件夹中的所有图片文件
File[] imageFiles = destFolder.listFiles((dir, name) -> name.endsWith(".jpg") || name.endsWith(".png"));
// 重命名图片文件
int count = 1;
for (File imageFile : imageFiles) {
String newName = String.format("%d%s", count++, ".jpg"); // 新文件名
Path oldPath = Paths.get(imageFile.getAbsolutePath());
Path newPath = Paths.get(destFolder.getAbsolutePath(), newName);
try {
Files.move(oldPath, newPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
```
上述代码中,我们创建了两个线程 `CopyImagesTask` 和 `RenameImagesTask`,分别用于拷贝和重命名图片。在 `CopyImagesTask` 中,我们使用 `Files.copy()` 方法将源文件夹中的图片文件拷贝到目标文件夹中;在 `RenameImagesTask` 中,我们使用 `Files.move()` 方法将目标文件夹中的图片文件重命名。注意,我们使用了 Lambda 表达式来筛选出文件夹中的图片文件。同时,我们使用了 `String.format()` 方法来生成新的文件名。
需要注意的是,在这个实现中,我们没有使用锁来控制线程访问共享资源的顺序。因此,如果两个线程同时访问目标文件夹,可能会出现文件名冲突的情况。如果需要避免这种情况,可以使用 Java 的锁机制或者其他同步技术来控制线程的访问顺序。