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");
}
}
-
自己利用线程的第一种实现方式,实现如下功能(多线程引例):
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();
}
}