以下题目都需要键盘录入,所以先定义一个键盘录入的工具类:
public class TestDirUtil {
/**
* 根据录入的路径判断此路径是不是一个合法的文件夹路径
* @return 文件夹的File对象
*/
public static File getDir() {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入一个文件夹路径:");
String path = sc.nextLine();// 键盘录入
File f = new File(path);// 封装成File对象
if (f.isDirectory()) {
return f;
} else {// 不存在或者是一个文件,再重新循环
System.out.println("输入的不是文件夹路径,请重新输入:");
}
}
}
}1、键盘录入一个文件夹路径,使用文件名称过滤器筛选将该文件夹下的小于200K的小文件获取并打印。
public class Test01 {
public static void main(String[] args) {
File file = TestDirUtil.getDir();
filter(file);
}
/**
* 递归得到文件夹下所有小于200k的文件并打印
* @param file 要筛选的文件夹
*/
public static void filter(File file) {
File[] lists = file.listFiles(new FilenameFilter() {// 文件名过滤器
@Override
public boolean accept(File dir, String name) {
File f = new File(dir, name);// File构造方法,创建新的File对象
// 是一个文件夹或文件小于200k都返回true
return f.isDirectory() || (f.isFile() && f.length() <= 1024 * 200);
}
});
// 递归步骤
for (File files : lists) {
if (files.isDirectory()) {// 如果是文件夹
filter(files);// 递归寻找其中的文件
} else {// 如果是文件
System.out.println(files.getName());// 打印经过过滤器筛选后的文件
}
}
}
}2、键盘录入一个文件夹路径,删除该文件夹(包含文件夹内容)
public class Test02 {
public static void main(String[] args) {
File file = TestDirUtil.getDir();
deleteDir(file);
System.out.println("删除成功!");
}
/**
* 递归删除文件夹内容
* @param file 要删除的文件夹
*/
public static void deleteDir(File file) {
File[] listFiles = file.listFiles();
if (listFiles != null) {
for (File f : listFiles) {
if (f.isFile()) {// 如果是文件
f.delete();// 删除这个文件
} else {// 如果是文件夹
deleteDir(f);// deleteDir(),寻找下一个文件
}
}
}
file.delete();// 执行过一次递归之后,剩下的就是文件夹,再删除文件夹
}
}3、键盘录入一个文件夹路径,统计该文件夹的大小
public class Test03 {
public static void main(String[] args) {
File file = TestDirUtil.getDir();
long dirSize = getDirSize(file);
System.out.println(dirSize + "字节");
}
/**
* 统计文件夹大小
* @param file 要统计大小的文件夹
* @return 文件夹的字节大小
*/
public static long getDirSize(File file) {
long count = 0L;// 定义求和变量
File[] listFiles = file.listFiles();
if (listFiles != null) {
for (File f : listFiles) {
if (f.isFile()) {// 如果是文件,有文件大小
count += f.length();// 文件大小赋给count
} else {// 是文件夹
count += getDirSize(f);// 继续递归寻找文件,找到文件后再把结果赋给count
}
}
}
return count;
}
}
4、键盘录入一个源文件夹,再键盘录入一个目标文件夹,将源文件夹拷贝到目标文件夹中(包含内容)
public class Test04 {
public static void main(String[] args) throws IOException {
System.out.print("源文件夹,");
File sourceDir = TestDirUtil.getDir();
System.out.print("目标文件夹,");
File targetDir = TestDirUtil.getDir();
copyDir(sourceDir, targetDir);
System.out.println("文件夹拷贝成功!");
}
/**
* 复制源文件夹的所有内容到目标文件夹中
* @param sourceDir 源文件夹路径
* @param targetDir 目标文件夹路径
* @throws IOException
*/
public static void copyDir(File sourceDir, File targetDir) throws IOException {
File newDir = new File(targetDir, sourceDir.getName());// 创建新文件夹
newDir.mkdir();
File[] list = sourceDir.listFiles();// 获取源文件夹中文件对象到File数组中
if (list != null) {
for (File f : list) {// 遍历所有的File对象
// 如果是文件夹,在目标文件夹中创建一个同名文件夹,然后再在源文件夹中复制文件到目标文件夹
if (f.isDirectory()) {
copyDir(f, newDir);// 递归寻找文件
} else {// 是文件时开始复制
File newFile = new File(newDir, f.getName());// 确定新文件的路径
InputStream in = new FileInputStream(f);
// 把文件流输出到目标文件夹的文件中,没有文件会自动创建
OutputStream out = new FileOutputStream(newFile);
int len;
byte[] arr = new byte[8192];
while ((len = in.read(arr)) != -1) {
out.write(arr, 0, len);
}
out.close();
in.close();
}
}
}
}
}5、键盘录入一个文件夹路径,统计该文件夹下的各种后缀名的文件的个数,例如:.txt有10个,.java有30个......
public class Test05 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();// 以Map存储各种后缀名文件的个数
File file = TestDirUtil.getDir();
getSuffix(toMap(map, file));
}
public static Map<String, Integer> toMap(Map<String, Integer> map, File file) {
File[] lists = file.listFiles();
for (File f : lists) {
if (f.isFile()) {// 如果是文件再判断文件名有没有.
/*
* String[] split = f.getName().split("[.]");// 以.分割文件名
* String suffix = split[split.length - 1];// 数组中最后一个元素肯定是后缀名
*/
int indexOfDot = f.getName().lastIndexOf(".");// 最后一个.的索引
// 截取最后一个.后的内容(包括.),如果没有.就设后缀名为空后缀
String suffix = indexOfDot >= 0 ? f.getName().substring(indexOfDot)
: "空后缀";
map.put(suffix, map.containsKey(suffix) ? map.get(suffix) + 1 : 1);
// map.merge(suffix, 1, Integer::sum);
} else {// 如果是文件夹,就继续递归寻找
toMap(map, f);
}
}
return map;
}
public static void getSuffix(Map<String, Integer> map) {
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("." + entry.getKey() + "有" + entry.getValue() + "个");
}
}
}
版权声明:本文为sinat_41152339原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。