File类表示文件或目录在JVM中的一种抽象形式。
File类对文件或目录进行了封装,提供对文件或目录的操作方法,可以方便编程时使用。
注意:
•创建File对象,File可以表示文件或目录。
•不同的OS中,路径的分隔符也不相同。windows中,路径分隔符可以使用/或\\;Linux或unix中,路径分隔符使用/;File类提供了一个静态的路径分隔符的属性,该属性根据JVM在不同的OS中,可以得到当前OS的路径分隔符。
下面的一些方法在以后的编程应用中会经常用到,应该牢记。
package com.jcxy.demo17;
import java.io.File;
import java.io.IOException;
public class FileTest
{
public static void main(String[] args) throws IOException
{
File f = new File("f:\\wanghu");
File f2 = new File("f:\\wanghu");
//当文件不存在时创建并返回true,存在则返回
System.out.println(f.createNewFile());
// 测试此抽象路径名表示的文件或目录是否存在。
System.out.println(f.isFile());
System.out.println(f.delete());
//测试此抽象路径名表示的文件或目录是否存在。
System.out.println(f.exists());
//返回此抽象路径名的绝对路径名形式。
File f3 = f2.getAbsoluteFile();
System.out.println(f3);
//返回由此抽象路径名表示的文件或目录的名称。
System.out.println(f2.getName());//wanghu
//返回此抽象路径名父目录的路径名字符串
System.out.println(f2.getParent());
//返回此抽象路径名父目录的抽象路径名
System.out.println(f2.getParentFile());
//测试此抽象路径名表示的文件是否是一个标准文件
System.out.println(f2.isFile());
//返回此抽象路径名表示的文件最后一次被修改的时间。
long l = f2.lastModified();
System.out.println(l);
File f4 = new File("f:\\hu\\haha");
//创建此抽象路径名指定的目录。只能创建一层
System.out.println(f4.mkdir());//false
//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。可以创建多层
System.out.println(f4.mkdirs());//true
//与系统有关的默认名称分隔符
System.out.println(f4.separator);
}
}
接下来我们可以通过上面的方法来完成一个题目,不过在完成之前应该了解一下什么是递归,下面会用到,以后也会用到。
•函数的递归:
函数的递归调用,就是在函数中,调用自身。
1、函数递归,必须要有一个能够终止递归的出口。
2、函数递归时,还要注意,如果递归的层次过多,可能造成内存溢出。(比如不停的创建对象,当递归循环到一定程度,内存装不下所new出来的对象就会导致内存溢出)
我们来打印一个目录的层次结构
例如:
Test
Acorn
acorn.txt
Banji
Banji
banji.txt
bandi.conf
banjia.txt
Colro
Coral
coral
coral.txt
db.conf
hu.txt
从外往内打印出文件的层次结构,属于同一个层次结构的目录或者文件应该有相同的tab位即空格数量相同。
分析:
1、我们第一步应该是要获取到文件夹及里面的内容,可以通过File类中的方法实现
2、当在同一级中,如果是文件夹则继续递归遍历里面的内容,如果是文件则直接打印
3、我们应该定义一个方法专门来负责打印tab的数量
下面来看代码
package com.jcxy.demo17;
import java.io.File;
public class Test6
{
public static void main(String[] args)
{
//首先找到这个文件
File file = new File("f:/Test");
//定义一个方法用于完成文件夹的遍历
//第一个参数是文件路径,第二个参数用于递归的时候传入,来打印tab数量
getDirPath(file,0);
}
private static void getDirPath(File file, int count)
{
//得到Test文件夹中的文件夹及文件
File[] fes = file.listFiles();
//如果file中没有文件夹,只有文件,则打印输出文件名称即可
//不用向下执行,所以直接return
if(fes == null)
{
return;
}
//定义一个方法负责打印tab数量
printSpace(count);
//得到文件夹的名字
String strFile = file.getName();
System.out.println(strFile);
//接着文件夹中文件和文件夹应该多一个tab位
count++;
//遍历文件夹中的文件或文件夹
for(File fe : fes)
{
//如果是文件夹则继续递归调用
if(fe.isDirectory())
{
getDirPath(fe,count);
}
else
{
printSpace(count);
System.out.println(fe.getName());
}
}
}
private static void printSpace(int count)
{
for(int i = 0; i < count; i++)
{
System.out.print("\t");
}
}
}
通过简单的方法调用及递归可以实现文件层次结构的打印输出