黑马程序员技术交流社区
标题:
一个关于IO流中FileFilter接口的问题
[打印本页]
作者:
创造命运
时间:
2014-4-27 16:57
标题:
一个关于IO流中FileFilter接口的问题
昨天晚上在论坛里看到一个问题,意思就是通过使用FileFilter将一个目录下(包括子目录)的所有.txt文件挑选出来。
下面是我写代码:
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
public class Test1{
public static void main(String[] args) {
File file = new File("e:\\JAVA\\String\\Test");
FileFilterByName ffbn = new FileFilterByName();
//File[] files = file.listFiles(ffbn);
//System.out.println(files.length);
List<File> list = new ArrayList<File>();
getFileToList(file, list, ffbn);
for (File file2 : list){
System.out.println(file2);
}
}
private static void getFileToList(File file, List<File> list, FileFilter ffbn) {
File[] files1 = file.listFiles();
File[] files2 = file.listFiles(ffbn);
for (File file1 : files1) {
if (file1.isDirectory()) {
getFileToList(file1, list, ffbn);
}
}
for (File file2 : files2)
{
list.add(file2);
}
}
}
class FileFilterByName implements FileFilter
{
/*private File file;
public FileFilterByName(File file)
{
this.file = file;
}*/
public boolean accept(File file)
{
if (file.getName().endsWith(".txt"))
{
return true;
}
return false;
}
}
以上代码已经实现了上述要求的功能,但是问题不在这里。在这之前我不知道有FileFilter这个接口,所以就慢慢查API文档来做的。
刚开始我在创建一个类实现FileFilter这个接口的时候,代码是这样写的,就是将上面代码的FileFilterByName类中的注释去掉。这样就出问题了,我一直认为没有错,可是我在主函数里用这两句话File[] files = file.listFiles(ffbn); System.out.println(files.length); 测试,输出的结果总是0。当时就搞郁闷了,不知道问题到底出在哪。然后就在网上找相关问题,后来知道将下面几条代码注释掉就可以了。
private File file;
public FileFilterByName(File file)
{
this.file = file;
}
我的问题是:为什么我显示的给accept这个方法传递一个参数,反而不能实现过滤的功能呢?
如果不给accept显示的传递一个参数,那么它的参数又是如何得到的?它的参数所代表的的路径又是什么呢?它是如何获取到该路径的呢?
作者:
362688114
时间:
2014-4-27 18:40
用 递归 可以解决。
作者:
天涯追梦
时间:
2014-4-28 20:41
楼主FileFilter是个抽象类,FileFilterByName 既然是继承的 FileFilter,而FileFilter的构造方法只有FileFilter() ,所以楼主写自定义构造方法private File file;
public FileFilterByName(File file)
{
this.file = file;}
貌似有些不妥吧,
继承FileFilter只是为了创建过滤器,即只需指定过滤器按什么过滤就行了,没必要再把文件创建在过滤器中呀
如果过滤中要想自定义何类型种文件可以这么定义
import java.io.File;
import java.io.FileFilter;
public class FileFilterBySuffix implements FileFilter {
private String suffix;
public FileFilterBySuffix(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(suffix);
}
}
复制代码
作者:
天涯追梦
时间:
2014-4-28 20:47
下面是完整代码,楼主可以参考一下
功能:建立指定文件的清单文件。 将指定目录下的指定文件(包含子目录)的绝对路径写入到一个文件中。 该文件就作为指定文件的清单文件。
代码1:
package mytest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TestTest {
public static void main(String[] args) throws IOException {
File file = new File ("e:\\");
File files = new File("e:\\path.txt");
List <File> list = new ArrayList<File>();
FileFilterByName filter =new FileFilterByName("txt");
getFileToList(file, list ,filter);
getPath(list,files);
for (File file2 : list) {
System.out.println(file2);
}
}
private static void getPath(List<File> list, File files) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(files));
for (File file : list) {
bw.write(file.getAbsolutePath());
bw.newLine();
bw.flush();
}
bw.close();
}
private static void getFileToList(File file, List<File> list,
FileFilterByName filter) {
File [] f = file.listFiles();
for (File ff : f) {
if (ff.isDirectory()) {
getFileToList(ff, list, filter);
}
else{
if (filter.accept(ff)) {
list.add(ff);
}
}
}
}
}
复制代码
代码2:
package mytest;
import java.io.File;
import java.io.FileFilter;
public class FileFilterByName implements FileFilter {
private String suffix;
public FileFilterByName(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.getName().endsWith(suffix);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2