使用JAVA回答。现有A、B两个线程文件夹S中有10张图片图片名分别为a1jpg或a1png、b2jpg或b2png、c3d4以此类推k10jpg或k10pngA线程任务是往文件夹D中拷贝图片B线程任务是每有一张图片拷贝进来需将图片名称改成1jpg或1png。。以此类推到10png或10jpg然后程序退出。要求:A线程不能一次拷贝多张图片B线程不能一次修改多张图片名即模拟生产者、消费者拷贝进一个修
。
以下是使用Java多线程实现的代码:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
public class ImageCopyAndRename {
private static final int NUM_IMAGES = 10;
private static final String SOURCE_FOLDER = "S/";
private static final String DESTINATION_FOLDER = "D/";
private static final BlockingQueue<File> queue = new LinkedBlockingQueue<>();
public static void main(String[] args) {
Thread t1 = new Thread(new ImageCopyTask());
Thread t2 = new Thread(new ImageRenameTask());
t1.start();
t2.start();
}
static class ImageCopyTask implements Runnable {
@Override
public void run() {
for (int i = 1; i <= NUM_IMAGES; i++) {
File sourceFile = new File(SOURCE_FOLDER + "a" + i + ".jpg");
if (!sourceFile.exists()) {
sourceFile = new File(SOURCE_FOLDER + "a" + i + ".png");
}
File destinationFile = new File(DESTINATION_FOLDER + sourceFile.getName());
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destinationFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
queue.put(destinationFile);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class ImageRenameTask implements Runnable {
@Override
public void run() {
for (int i = 1; i <= NUM_IMAGES; i++) {
try {
File fileToRename = queue.take();
String extension = fileToRename.getName().substring(fileToRename.getName().lastIndexOf("."));
File renamedFile = new File(fileToRename.getParentFile(), i + extension);
fileToRename.renameTo(renamedFile);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
该程序中,ImageCopyTask和ImageRenameTask分别表示文件拷贝和文件重命名的任务。其中,ImageCopyTask从源文件夹S中拷贝图片到目标文件夹D,并将拷贝完成的文件对象加入队列中;ImageRenameTask从队列中取出刚刚拷贝完成的文件对象,将其重命名为1.jpg、2.png等格式,并输出到目标文件夹中。
需要注意的是,这里使用了Java的BlockingQueue阻塞队列来实现生产者、消费者模型,保证了A线程和B线程之间的同步。同时,程序中使用了try-with-resources语句来自动关闭文件输入输出流,避免了资源泄露问题
原文地址: https://www.cveoy.top/t/topic/fsSw 著作权归作者所有。请勿转载和采集!