关于FilenameFilter的一个问题,为何无法过滤非当前文件夹中的文件夹

open4u 2011-12-20 12:04:42
用此过滤器过滤当前文件夹是可以的,也没有问题,但当我将文件夹的路径不设置成当前文件夹,也就是“.”之外,如果过滤指定的文件时,是可以的,但是如果要过滤文件夹就不行了。求解。


核心代码:
File f = new File("/");
//String[] s = f.list();//用此可以得到所有文件以及文件夹
String[] s = f.list(new MyfileNameFiltter());用此只能过滤指定文件,不能过滤文件夹
for(String a :s){
System.out.println(a);

}
System.out.println(s.length);
}

下面是实现接口的类:
public class MyfileNameFiltter implements FilenameFilter{

@Override
public boolean accept(File dir, String name) {
return (new File(name).isDirectory());//想得到文件夹却不能成功
// || name.endsWith(".jpg") 如果过滤jpg文件是可以的
}


}



大家有遇到这样子的问题么?请高手解答一下,谢谢!
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoyang00 2012-05-05
  • 打赏
  • 举报
回复
可是我怎么显示指定文件名后缀的文件啊?比如.txt文件
wang7535067 2011-12-20
  • 打赏
  • 举报
回复
楼上正解,
fainfy 2011-12-20
  • 打赏
  • 举报
回复

public static void main(String[] args) {

File file = new File("E:\\");
String[] files = file.list(new FilenameFilter() {

@Override
public boolean accept(File dir, String name) {
return !(new File(dir, name)).isDirectory();
}
});

for (String string : files) {
System.out.println(string);
}
}


楼主给分噢。
因为name是文件的名称,并不是一个“路径”,而dir表示当前文件的路径。
噢噢噢噢 2011-12-20
  • 打赏
  • 举报
回复
FilenameFilter 是判断制定的文件名是否包含在目录中
Tests if a specified file should be included in a file list.
也就是说
public boolean accept(File dir, String name) {}
判断dir中是否存在名为name的文件
想过滤文件 请使用1楼的FileFilter
open4u 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 inhibitory 的回复:]
java.io.FileFilter

boolean accept(File pathname)
Tests whether or not the specified abstract pathname should be included in a pathname list.

你实现的是哪个FileFilter?
使用@Override都没有提示错误,肯定不是java.……
[/Quote]

确实不是那个,我实现的是import java.io.FilenameFilter;
它和FileFilter类似,但不一样。

Inhibitory 2011-12-20
  • 打赏
  • 举报
回复
java.io.FileFilter

boolean accept(File pathname)
Tests whether or not the specified abstract pathname should be included in a pathname list.

你实现的是哪个FileFilter?
使用@Override都没有提示错误,肯定不是java.io.FileFilter

@Override
public bool accept(File pathname) {
return pathname.isDirectory() || getName().match(".extension$"); // match这部分可以自己实现
}
1. IO:(Input Output)是输入输出流 从内存到硬盘就是输出流Output 从硬盘到内存就是输入流Input IO操作的最基础的是文件File 2. File 1. 概念:就是java的一个文件或者文件夹。如果没有后缀就表示是一个文件夹,如果有后缀就表示文件。 2. 作用:为了IO流提供操作的基础 3. 使用: 1. 常量: 1.1. static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。 1.2. static String separator 2. 构造方法: 2.1 File(String pathname) 根据文件名创建一个File对象, pathname:(如果有后缀就是一个文件对象,如果没有后缀会默认为是一个文件夹对象) 1. 相对路径:相对于当前Java类的项目 2. 绝对路径:从根目录或者盘符开始 /都表示从根目录或者盘符开始 2.2 File(String parent, String child) 在父级目录下创建一个文件或文件夹 parent:父级目录 child:当前目录或者当前文件 2.3 File(File parent, String child) 在父级目录下创建一个文件或文件夹 3. 常用方法: 常用方法:获取子文件夹或者子文件方法 * 1.String[] list()获取当前文件夹下所有的子文件夹或者子文件的名 //文件没有下一级 2.File[] listFiles() 获取当前文件夹下所有的子文件夹或者子文件对象 ===================================有过滤功能=================================== * 3.String[] list(FilenameFilter filter) 获取根据文件名过滤后的文件名 FilenameFilter:文件名过滤器接口 4.File[] listFiles(FilenameFilter filter) 获取根据文件名过滤后的文件对象 FilenameFilter:文件名过滤器接口 -----------------------------上面只能根据文件名或者文件夹过滤,下面的可以通过文件的其他属性过滤,例如:文件大小等----------------------------- 5.File[] listFiles(FileFilter filter) 获取根据文件过滤后的文件对象 FileFilter:文件过滤器接口 2. 递归: 1. 概念:是一种思想,也是一种算法。在方法内部调用自己的方法。(自己干自己) 2. 作用:就是简化有相似的业务逻辑(循环)代码。 3. 使用规律特点: 1. 通过数值带入的方式,查找逻辑规律: 将所有的已知条件写出来 就是有相似运算逻辑的代码 2. 通过条件判断(条件/循环)的方式,在满足条件的时候根据规律调用自己的方法。 如果不满足就不会自己的方法,这就是出口 4. 使用场景: 1. 树状结构数据、菜单结构、上下级关系等的数据查询 2. 有相似逻辑运算的结构 3. 适用于层级结构少,数据量小的场景。(最重要)如果层级多,且数据量大用循环。 5. 解决了哪些问题: (1)数据的定义是按递归定义的。(Fibonacci函数:斐波拉契数列) (2)问题解法按递归算法实现。(汉诺塔问题) 这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。 (3)数据的结构形式是按递归定义的。 如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。 6. 注意事项: 1. 递归必须 有出口 2. 能用循环用循环,不要用递归,因为效率极其低下。 为什么效率低下? 方法的调用都是创建新栈帧,入栈,而栈层级是有限制的 StackOverflowError : 栈内存溢出错误。
IO ============================================================================================================================================= * Input /Output 输入 输出 保存文件 读取文件 java.io 包 java.io.File ============================================================================================ *表示磁盘文件或目录的路径 *可以表示一个不存在的路径 创建实例 ------------------------------------- 1 File f=new File("d:/abc") (d:\\abc) 2 File f=new File ("目录","文件名") 创建一个 File 封装对象 可以不存在 方法 -------------------------------------------- 文件、目录属性方法 文件、目录属性 canRead() canWrite() canExecute() 是否可读可写可执行 isHidden() 是否隐藏文件 exists() 表示的路径是否存在 getAbsolutePath() 完整路径 getName() 文件名 getParent() 父目录 lastModified() 最后修改时间,毫秒值 length() 文件字节量,对目录无效 isDirectory() 是否文件夹 isFile() 是否文件 getTotalSpace() 空间总大小 getFreeSpace() 可用空间 文件、目录操作 createNewFile() 创建文件 delete() 删除文件或“空目录” mkdir() 创建单层目录 mkdirs() 创建多层目录 renameTo() 改名、移动 *) 创建删除重命名方法返回 boolean,表示操作是否成功 File.createTempFile() 在系统临时目录创建临时文件 目录列表 list() 返回 String[],包含子文件、子目录名称 listFiles() 返回 File[],包含子文件、子目录的 File 对象 list(FilenameFilter) listFiles(FilenameFilter) listFiles(FileFilter) 只列出符合过滤条件的文件、目录, 参数: 外接的过滤器 private static void test1() { // File f=new File("d:/rand.txt"); // File f=new File("d:/abad"); File f=new File("d:/scq"); System.out.println("是否可读:"+f.canRead()); System.out.println("是否可写:"+f.canWrite()); System.out.println("是否是隐藏:"+f.isHidden()); System.out.println("文件的绝对路径:"+f.getAbsolutePath()); System.out.println("获得文件名:"+f.getName()); System.out.println("获得父类目录名:"+f.getParent()); System.out.println("获得最后一次修改时间:"+f.lastModified()); System.out.println("文件字节量:"+f.length()); System.out.println("是否是目录:"+f.isDirectory()); System.out.println("是否是文件:"+f.isFile()); System.out.println("获得总空间大小:"+f.getTotalSpace()); System.out.println("获得剩余空间大小:"+f.getFreeSpace()); } 文件目录操作方法 public class Test2 { /** * @author aibin zhang * @param args * @throws IOException */ public static void main(String[] args) throws IOException { test4(); } //创建临时文件 文件名称不能太短 private static void test4() throws IOException { File f = File.createTempFile("abc", ".txt"); System.out.println(f.getAbsolutePath()); } // 测试renameto方法 移动和更改问价名 private static void test3() { File f1 = new File("d:/rand.txt"); File f2 = new File("d:/r.txt"); // 刚改前查看文件是否存在 System.out.println(f1.getName() + "是否存在" + f1.exists()); System.out.println(f2.getName() + "是否存在" + f2.exists()); // 使用renameto方法 System.out.println("文件名是否更改成功:" + f1.renameTo(f2)); // 改名以后的的状态 System.out.println(f1.getName() + "是否存在" + f1.exists()); System.out.println(f2.getName() + "是否存在" + f2.exists()); } // 测试创建单层目录mkdir和多层目录mkdirs private static void test2() { File f = new File("d:/dir1/dir2"); if (f.exists()) { System.out.println("是否成功删除:" + f.delete()); // 获得父类目录文件对象实例调用delete方法删除 f.getParentFile().delete(); } else { System.out.println("是否成功创建:" + f.mkdirs()); } } // 测试创建和删除文件 private static void test1() throws IOException { File f = new File("d:/f1.dlkjkajsdklgjexe"); if (f.exists()) {// 是够存在此文件 System.out.println("是否成功删除:" + f.delete()); } else { System.out.println("是否成功创建:" + f.createNewFile()); } } } 目录列表 --------------------------------------------------------------------------------- list listFlie list(FilenameFilter ) 文件名称过滤器 listFiles(FilenameFilter) 文件属性过滤器 public class Test1 { public static void main(String[] args) { test1(); } /////////////////////2014-8-23文件筛选操作 private static void test1() { File f=new File("D:/bookandimage"); String [] name=f.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".zip"); } }); File [] files=f.listFiles(new FileFilter() { public boolean accept(File f) { return f.length()>=20*1024; } }); for (File file : files) { int len=(int) (file.length()/1024); System.out.println(file.getName()+"---"+len+"KB"); } for( String na : name) { System.out.println(na); } } } ///////////查看目录大小 // 主要用到的是 listfiles isFile package tarena.day1802; import java.io.File; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.println("输入目录:"); String path=new Scanner(System.in).nextLine(); File dir=new File(path); long len=dirLength(dir); System.out.println(len/1024+"KB"); } private static long dirLength(File dir) { /* * 1 定义累加变量 long len * 2 获得目录列表 dir.listFiles赋给files * 3 判断files数组是否是null值 * 如果是null 返回return 0; * 5遍历从数组files取出的每个对象 赋给f * 6判断f是文件 * 获得文件大小累加到len * 否则是文件夹 * 再调用自身方法 dirLength * 求文件夹大小累加到len * return len; * */ long len=0; File [] files=dir.listFiles(); if(files==null){ return 0; } for (File file : files) { if(file.isFile()){ len+=file.length(); }else { len+=dirLength(file); } } return len; } } ////删除目录 public class Test1 { public static void main(String[] args) { System.out.println("输入目录名"); String path=new Scanner(System.in).nextLine(); File dir=new File(path); boolean success=dirDelete(dir); if(success){ System.out.println("删除成功!"); }else{ System.out.println("删除失败!!"); } } private static boolean dirDelete(File dir) { /* * 2 获得目录列表 dir.listFiles赋给files * 3 判断files数组是否是null值 * 并返货尝试直接删除是否成功; * 5遍历从数组files取出的每个对象 赋给f * 6判断f是文件 * 直接删除f * 如果删除返回false * 否则是文件夹 * 再调用自身方法dirDelete来删除文件夹f * 如果失败则返回false * 遍历结束 删除 dir * 如果失败则返回 * */ File[] files = dir.listFiles(); if(files==null)return dir.delete(); for (File file : files) { if(file.isFile()){ if(!file.delete())return false; }else{ if(!dirDelete(file))return false; } } return dir.delete(); } } ================================================================================== java.io.RandomAccessFile --------------------------------------------------------------- // ***用来读写文件 //将一个文件看做是一个字节数组 //用下标值访问摸个位置的字节值 创建实例 ----------------------- 1 RandomAccessFile raf= new RandomAccessFile(文件,“r”) r 只读模式 1 RandomAccessFile raf= new RandomAccessFile(文件,“rw”) r 读写模式 方法 ------------------------ 写字节 write() -------- -------- write (int b) 将int 四字节的末尾字节 写到文件里 【1】【2】【3】【4】 --》【4】 write ( byte [] b) 将数组所有字节值 全部写到文件 write (byte [] buf,int start ,int n) 将数组的start开始位置,n个范围的字节值,写到文件 读字节 read() --------- --------- read() 读取一个字节值,再前面补三个0字节 变成 int 类型 [4] --> [1][2][3][4] 如果没有数据,返回 -1; read ( byte[] buf) 根据数组的长度读取一批字节值,放入数组 一次读取的长度是数组的长度 返回每次存放到数组的字节数量 如果没有数据 则返回 -1; seek(int position) 将指针定位到指定位置 public class Test1 { public static void main(String[] args) throws IOException{ /* * 如果文件不存在 自动新年检文件 * 如果文件夹不存在则出现FileNotFoundException、 * * */ RandomAccessFile raf=new RandomAccessFile("d:/f2.mp3", "rw"); //写入单个字节值 raf.write(97); raf.write(98); raf.write(99); raf.write(100); //写入一组数组字节 byte [] buf={101,102,103,104,105,106}; raf.write(buf); raf.write(buf,2,3); //调用seek 将指针调回 raf.seek(0); //读取文件字节 //单个字节读取 int b;//定义一个变量 int b 用来保存每次读取的字节值 while ((b=raf.read())!=-1){ System.out.println(b); } raf.seek(0); buf=new byte[5]; int n ; //用来保存每次读取或放入数组的字节数量 while((n=raf.read(buf))!=-1){ System.out.print(n+"--"); System.out.println(Arrays.toString(buf)); // while循环最后会打印出重复数据 //for循环可以避免打印出重复数据 for (int i = 0; i < n; i++) { System.out.println(buf[i]); } } //关闭数据连接 raf.close(); } } print out 97 98 99 100 101 102 103 104 105 106 103 104 105 5--[97, 98, 99, 100, 101] 97 98 99 100 101 5--[102, 103, 104, 105, 106] 102 103 104 105 106 3--[103, 104, 105, 105, 106] 103 104 105 writeInt (int b ) 输出 int 的四个字节 writeDouble(double b) 输出 double 的八个字节 writeUTF(String s) 先输出2个字节 表示字符串的字节长度 在输出字符串的字节数据 readInt() 读取4个字节作为一个int值 readDouble () 读取8个字节作为一个double值 readUTF() 先读取2个字节来确定字符创长度 在读取字符串的字节值 EOFException read读取异常 public class Test2 { public static void main(String[] args) throws Exception { test1(); } private static void test1() throws Exception { RandomAccessFile raf=new RandomAccessFile("d:/f3.java", "rw"); raf.write(97); raf.writeInt(97); raf.writeDouble(3.14); raf.writeUTF("a"); raf.seek(0); //从头到尾单字节输出 int b; while((b=raf.read())!=-1){ System.out.println(b); } System.out.println("****************************"); //从头到尾批量输出 raf.seek(0); byte [] buf=new byte[5]; while((b=raf.read(buf))!=-1){ System.out.println(b); System.out.println(Arrays.toString(buf)); } // //////////////////////////////////////////////// raf.seek(0); System.out.println("*********************************"); System.out.println("*********************************"); //read 是单字节读取 System.out.println(raf.read()); //读取int型数据 System.out.println(raf.readInt()); //读取Double类型数据 System.out.println(raf.readDouble()); //读取String类型数据 System.out.println(raf.readUTF()); raf.close(); } } getFilePointer() 获得指针当前位置 setLength(字节长度); 事先给数据把空间留足 可以将数据截取处理为指定长度 可以扩大数据物理空间为指定长度 -------------------------------------------------------------------------------- public class Test3 { /**@author aibin zhang * @param args */ public static void main(String[] args) { test1(); } private static void test1() { File f=new File("D:/bookandimage"); //转换成list String数组存放文件名称 String[] s=f.list(); //转换成listFiles file数组 File [] files=f.listFiles(); for (String s1 : s) { System.out.println(s1); } System.out.println("************************"); for (File file : files) { int l=(int) file.length()/1024/1024; System.out.println(file.getName()+"--"+l+"MB"); } } } 字段摘要 static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 static char pathSeparatorChar 与系统有关的路径分隔符。 static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 static char separatorChar 与系统有关的默认名称分隔符。 构造方法摘要 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 方法摘要 boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 int compareTo(File pathname) 按字母顺序比较两个抽象路径名。 boolean createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 static File createTempFile(String prefix, String suffix) 在默认临时文件目录创建一个空文件,使用给定前缀和后缀生成其名称。 static File createTempFile(String prefix, String suffix, File directory) 在指定目录创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 boolean delete() 删除此抽象路径名表示的文件或目录。 void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。 boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 File getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 File getCanonicalFile() 返回此抽象路径名的规范形式。 String getCanonicalPath() 返回此抽象路径名的规范路径名字符串。 long getFreeSpace() 返回此抽象路径名指定的分区未分配的字节数。 String getName() 返回由此抽象路径名表示的文件或目录的名称。 String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 File getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 String getPath() 将此抽象路径名转换为一个路径名字符串。 long getTotalSpace() 返回此抽象路径名指定的分区大小。 long getUsableSpace() 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 int hashCode() 计算此抽象路径名的哈希码。 boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。 boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 long length() 返回由此抽象路径名表示的文件的长度。 String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录的文件和目录。 String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录满足指定过滤器的文件和目录。 File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录的文件。 File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录满足指定过滤器的文件和目录。 File[] listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录满足指定过滤器的文件和目录。 static File[] listRoots() 列出可用的文件系统根。 boolean mkdir() 创建此抽象路径名指定的目录。 boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。 boolean setExecutable(boolean executable) 设置此抽象路径名所有者执行权限的一个便捷方法。 boolean setExecutable(boolean executable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的执行权限。 boolean setLastModified(long time) 设置此抽象路径名指定的文件或目录的最后一次修改时间。 boolean setReadable(boolean readable) 设置此抽象路径名所有者读权限的一个便捷方法。 boolean setReadable(boolean readable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的读权限。 boolean setReadOnly() 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 boolean setWritable(boolean writable) 设置此抽象路径名所有者写权限的一个便捷方法。 boolean setWritable(boolean writable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的写权限。 String toString() 返回此抽象路径名的路径名字符串。 URI toURI() 构造一个表示此抽象路径名的 file: URI。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧