------- android培训、java培训、期待与您交流!----------
1.File类File类是文件和目录路径名的抽象表示形式,用来将文件或者文件夹封装成对象,以方便对文件和文件夹进行操作。
他常用的构造方法有三个:
构造方法摘要 | |
---|---|
File(File parent,String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 | |
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 | |
File(String parent,String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
需要注意的是File类是将一个已经存在或未存在的文件或文件夹封装成对象。
比如File f = new File("C:\\1.txt");
如果1.txt存在,可以用exists()判断它是否存在;
如果它不存在,可以使用creatNewFile方法创建对象,而且返回boolean值表示是否成功。
此外,一个File对象既可以表示文件,也可以表示路径,使用isDirectoryh和isFile来判断文件对象表示的是文件还是目录。
如果他表示的是目录可以是使用list方法来获得该目录下的文件名的数组,
假如这个目录不存在,可以使用mkdir方法来创建它。
File类的常用方法:
int | compareTo(File pathname) 按字母顺序比较两个抽象路径名。 |
boolean | createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件 |
boolean | delete() 删除此抽象路径名表示的文件或目录。 |
void | deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
boolean | equals(Object obj) 测试此抽象路径名与给定对象是否相等。 |
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
String[] | list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
boolean | mkdir() 创建此抽象路径名指定的目录。 |
String | toString() 返回此抽象路径名的路径名字符串。 |
File[] | listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
2.FilenameFilter 文件过滤器
File的list(FilenameFilter filter) 的方法
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
它的参数是一个实现了FilenameFilter的对象,这个接口中只有一个方法
boolean | accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中。 |
要使用文件过滤器我们需要写一个实现了FilenameFilter接口的对象,并复写accept方法。
比如我们要打印出C盘根目录下的.txt文件
复写的时候我们只要传递我们所要求的格式的字符串就可以了
import java.io.File;
import java.io.FilenameFilter;
public class MyFilter implements FilenameFilter
{
private String ext;
public MyFilter(String ext) {
super();
this.ext = ext;
}
@Override
public boolean accept(File f, String name)
{
return name.endsWith(ext);
}
}
<p>public class FileDemo {</p><p> public static void main(String[] args) {
//传入规则
MyFilter mf = new MyFilter(".txt");
File f = new File("C://");
//调用File的listFiles对象
File[] files = f.listFiles(mf);
for(File file : files)
{
System.out.println(file);
}
}</p><p>}</p>
3.递归
那么如果我们想要打印出C盘中所有的txt文件怎么办呢?
首先,我们先介绍一下递归:
递归说的通俗点就是函数在方法体内调用自身:
举一个计算1-10相加的和的例子
public class digui {
public static void main(String[] args) {
System.out.println(getSum(10));
}
public static int getSum(int num)
{
if (num == 1)
return 1;
return num + getSum(num - 1);
}
}
使用递归的注意事项:
1.限定条件,就是限定递归退出的条件,就是上面的if(num == 1),
我们设想一下求和的最后一步应该是+1,所以我们就把他最后一次递归的条件设为退出递归的条件,也就是只有
最后一次递归的时候才执行那条语句。
2.递归的次数不能太大,否则它会导致内存溢出。
//打印出博客文件夹下的所有图片的名称
public class digui {
public static void main(String[] args) {
File f = new File("C:\\Users\\Administrator\\Desktop\\博客");
new Show( ).showPng(f);
}
}
public class Show
{
public void showPng(File f)
{
if(f.isFile()&& f.getName().endsWith(".png") )//和过滤器的原理是相同的,如果是png文件就打印出名字
{
//问题:为什么会打印那么多啊
System.out.println(f);
}
else if(f.isDirectory())//如果是目录,就将目录中的文件遍历,并依次此判断他是文件合适目录
{
File[] files1 = f.listFiles();
for(File file : files1)
{
showPng(file);
}
}
}
}