以下是使用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语句来自动关闭文件输入输出流,避免了资源泄露问题

使用JAVA回答。现有A、B两个线程文件夹S中有10张图片图片名分别为a1jpg或a1png、b2jpg或b2png、c3d4以此类推k10jpg或k10pngA线程任务是往文件夹D中拷贝图片B线程任务是每有一张图片拷贝进来需将图片名称改成1jpg或1png。。以此类推到10png或10jpg然后程序退出。要求:A线程不能一次拷贝多张图片B线程不能一次修改多张图片名即模拟生产者、消费者拷贝进一个修

原文地址: https://www.cveoy.top/t/topic/fsSw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录