创建文件夹(mkdir,mkdirs)
创建文件夹的两种方法:
import java.io.File;
/**
*
* @author 发达的范
* @date 2021/02/05 15:19
*/
public class makeFolds {
public static void main(String[] args) {
//指定的这个路径中/fada/fadada两个文件夹都是不存在的,所以使用mkdir创建失败,使用mkdirs创建成功
File direction = new File("E:/(A)PostgraduateFlies/JavaLearning/fada/fadada");
boolean flag=direction.mkdirs();
System.out.println(flag);
}
}
需要注意的是,这里的mkdir(),mkdirs()方法与创建文件的方法createNewFile()有一点相同,如果不存在创建成功,如果已经存在,则创建失败。
遍历文件夹的下一级(list,listFile)
import java.io.File;
/**测试 list:返回该文件夹中所有文件对象的名称
* listFile:返回该文件夹中所有文件对象
*
* @author 发达的范
* @date 2021/02/05 15:19
*/
public class makeFolds01 {
public static void main(String[] args) {
File dir = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects");
String[] subNames = dir.list();//list方法返回的是路径下所有文件(夹)名称组成的一个数组
for (String s : subNames) {
//使用增强for循环遍历数组
System.out.println(s);
}
File[] subFiles = dir.listFiles();//listFiles方法返回的是路径下所有的文件(夹)对象组成的数组
for (File f : subFiles) {
System.out.println(f.getAbsolutePath());//获取文件对象的绝对路径
// System.out.println(f);//直接输出的也是绝对路径
}
}
}
运行结果:
需要注意的是:list(),listFile()方法都是遍历指定路径文件夹的下一级,实际上除了下一级,往往还有子孙级。
获取计算机上所有磁盘的盘符:
File[] roots = dir.listRoots();
for (File r : roots) {
System.out.println(r);
}
运行结果:
遍历文件夹的所有子孙级
思路1:使用循环访问文件夹的子文件,直到访问的对象是文件时结束。
思路2:使用递归打印文件夹的所有子孙级。
但是,相应的这两种思路都有弊端。思路1使用循环,循环终止条件是访问对象是文件,但是如果一个文件夹里面既有文件夹又有文件,那么程序是如何访问,该如何结束循环?思路2使用递归,但是每次递归都是压栈操作,如果文件夹的子孙级很多,那么就会大量压栈造成内存空间占用过大。所以一般的思路是:能用循环解决尽量不用递归。
import java.io.File;
/**
* 打印文件夹的所有子孙级名称
*
* @author 发达的范
* @date 2021/02/05 15:19
*/
public class makeFolds02 {
public static void main(String[] args) {
// File dir = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects");
File dir = new File("E:/(A)PostgraduateFlies/GitHub Upload Folder");
printNames(dir,0);
}
public static void printNames(File file,int layer) {
for (int i = 0; i <layer ; i++) {
System.out.print(" - ");
}
System.out.println(file.getName());
if (null == file || !file.exists()) {
//如果传递的是空对象或文件不存在
return;
} else if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
printNames(f,layer+1);
}
//for (File f : file.listFiles()) {
// printNames(f, layer + 1);
//}
} else {
System.out.println(file.getName());
}
}
}
统计文件夹所有子孙级文件的大小(使用递归)
import java.io.File;
/**
* 统计文件夹的所有子孙级文件的大小
*
* @author 发达的范
* @date 2021/02/05 15:19
*/
public class makeFolds03 {
private static long length = 0L;
public static void main(String[] args) {
File dir = new File("E:/(A)PostgraduateFlies/GitHub Upload Folder");
count(dir);
System.out.println(length);
}
public static void count(File file) {
if (null != file && file.exists()) {
//如果文件存在
if (file.isDirectory()) {
//如果是文件夹
for (File f : file.listFiles()) {
count(f);
}
} else {
//如果是文件
length += file.length();
}
} else {
return;
}
}
}
运行结果:
上面只是简单实现了统计文件夹及其子孙级的大小的功能,下面使用面向对象的方式重新实现该功能。
/**
* 统计文件夹的所有子孙级文件的大小
*
* @author 发达的范
* @date 2021/02/06 21:40
*/
public class makeFolds03 {
public static void main(String[] args) {
DirCount dirCount= new DirCount("E:/(A)PostgraduateFlies/EndNote X9&Github");
dirCount.count(dirCount.getSrc());
System.out.println(dirCount.getLength());
}
}
import java.io.File;
/**
* 统计文件夹的所有子孙级文件的大小
*
* @author 发达的范
* @date 2021/02/06 21:45
*/
public class DirCount {
private static long length;
private static String path;
private static File src;
public DirCount() {
}
public DirCount(String path) {
this.path = path;
this.src = new File(path);
}
public static long getLength() {
return length;
}
public static File getSrc() {
return src;
}
public void count(File file) {
if (null != file && file.exists()) {
//如果文件存在
if (file.isDirectory()) {
//如果是文件夹
for (File f : file.listFiles()) {
count(f);
}
} else {
//如果是文件
length += file.length();
}
} else {
return;
}
}
}
运行结果: