复制目录及指定类型的文件到原目录相应位置 多线程引例

本文介绍了一个Java程序,该程序能够复制指定目录及其子目录中的所有.java文件,并保持目录结构不变。同时,文章还提供了一个多线程示例,演示了如何在一个线程中持续输出问候语,而在检测到特定键盘输入时停止输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.复制目录,要求:
a. 复制目录及其所有子目录,保证在复制的目标目录中,目录结构和原目录相同
b. 同时,对于原目录及其子目录,只将原目录中的指定类型的.java文件,
复制到目标目录中,对应的相同目录中

package com.homework.homework0731;

import java.io.*;
import java.util.ArrayList;

/**
 * @Author jinman1012@qq.com   2020/7/31 19:32
 * @Version 1.0
 * 思路:
 * 1、先进行目录的拷贝
 * 2、确认”.java“文件的目录确认
 * 3、java文件的拷贝 文件操作建议FileWriter
 * D:\\test ====>>> D:\\test2
 */

public class Problem1 {
    //java文件集合
    static ArrayList<File> result = new ArrayList<>();
    //目录集合
    static ArrayList<File> resultDirectory = new ArrayList<>();
    static MyFileFilter myFileFilter = new MyFileFilter();

    public static void main(String[] args) {
        String pathName = "D:\\test";
        File file = new File(pathName);
        //找文件
        findJava(file);
        //创建目录结构
        mkdirDir();
        //复制文件到指定目录
        copyJava();
    }

    //第一步:遍历目录,找到并返回所有.java结尾的文件的绝对路径的字符串数组
    public static void findJava(File pathName) {
        File[] fileNames = pathName.listFiles();
        //null表示pathName是目录
        if (pathName.isDirectory())
            resultDirectory.add(pathName);
        if (fileNames == null || fileNames.length == 0) {
            if (pathName.isFile() && myFileFilter.accept(pathName))
                result.add(pathName);
            return;
        }
        //递归
        for (int i = 0; i < fileNames.length; i++) {
            findJava(fileNames[i]);
        }
    }

    //第二步:创建目录结构
    public static void mkdirDir() {
        File[] dirs = resultDirectory.toArray(new File[0]);
        String temp;
        for (int i = 0; i < dirs.length; i++) {
            temp = dirs[i].toString().replace("\\test\\", "\\test2\\");
            dirs[i] = new File(temp);
            dirs[i].mkdirs();
        }
    }

    //第三步:使用IO流进行copy
    public static void copyJava() {
        //java文件目录
        File[] files = result.toArray(new File[0]);
        //目标目录
        File[] filesDis = result.toArray(new File[0]);
        //目标目录替换
        String temp;
        for (int i = 0; i < filesDis.length; i++) {
            temp = filesDis[i].toString().replace("\\test\\", "\\test2\\");
            filesDis[i] = new File(temp);
        }
        //开始复制
        for (int i = 0; i < files.length; i++) {
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new FileInputStream(files[i]);
                out = new FileOutputStream(filesDis[i]);
                int len;
                byte[] copyByte = new byte[1024];
                while ((len = in.read(copyByte)) != -1) {
                    //len指的是将指定 byte 数组中从偏移量 off 开始的 len 个《字节》写入此文件输出流。不是指数组下标
                    out.write(copyByte, 0, len);
                }
                in.close();
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

//文件名过滤器
class MyFileFilter implements FileFilter {
    @Override
    public boolean accept(File targetFile) {
        return targetFile.getName().endsWith(".java");
    }
}

  1. 自己利用线程的第一种实现方式,实现如下功能(多线程引例):

    a. 程序不停地在屏幕上输出一句问候的语句(比如“你好”)
    (时间间隔一定要大些比如3s(或大于3s),因为在控制台窗口,输入和输出不能同时发生,
    我们只能在两次输出“你好”的间隙,从键盘输入数据,才能保证键盘输入被正确接收)
    b.同时,当我通过键盘输入固定响应的时候,程序停止向屏幕输出问候的语句

package com.homework.homework0731;

import java.util.Scanner;

/**
 * @Author jinman1012@qq.com   2020/7/31 19:32
 * @Version 1.0
 */
public class Problem2 {
    //定义一个成员变量
    static boolean flag = true;

    public static void main(String[] args) {
        String words = "hello world";
        //
        sayHello(words);
        waitToStop();
    }

    public static void sayHello(String words) {
        //另运行一个线程
        new MyThread() {
            //循环输出
            @Override
            public void run() {
                //待另一个线程修改循环条件
                while (flag) {
                    System.out.println("hell world");
                    try {
                        sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    //停止输出循环
    public static void waitToStop() {
        new MyThread() {
            @Override
            public void run() {
                Scanner input = new Scanner(System.in);
                String str;
                while (true) {
                    str = input.nextLine();
                    if ("886".equals(str)) {
                        //修改成员变量
                        flag = false;
                        break;
                    }
                }
            }
        }.start();
    }
}

class MyThread extends Thread {
    public MyThread() {
    }
    @Override
    public void run() {
        super.run();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值