18、File类使用list方法的一点奇怪现象

来源:互联网 发布:mac python idle 运行 编辑:程序博客网 时间:2024/05/16 17:30

File类的list方法返回一个String[],记录有当前file下所有文件和文件夹的名字list接收一个FilenameFilter接口对象为参数。

FilenameFileter是一个函数式接口,里面有一个boolean accept(File dir, String name)的方法,以方法的返回值判断是否把当前的name放入返回的String数组中

比如疯狂java的例子:

import java.io.*;public class FilenameFilterTest{public static void main(String[] args){File file = new File(".");// 使用Lambda表达式(目标类型为FilenameFilter)实现文件过滤器。// 如果文件名以.java结尾,或者文件对应一个路径,返回trueString[] nameList = file.list((dir, name) -> name.endsWith(".java")|| new File(name).isDirectory());for(String name : nameList){System.out.println(name);}}}
创建一个当前目录的File对象file,并用lambda表达式实现了accept方法。file.list()方法是一个目录操作方法,如果对于以文件创建的File对象,调用此方法不会返回任何值。list方法遍历文件夹下的文件夹和文件的名字,放入name中传递给accept方法,由accept方法的返回值决定要不要将当前name返回,以得到我们想要的文件夹或文件名。

再看以下代码:

import java.io.*;public class FileTest {public static void main(String[] args) throws IOException{File file = new File("..");System.out.println("name : " + file.getName());System.out.println("absolutepath : " + file.getAbsolutePath());System.out.println("absolute parent path : " + file.getAbsoluteFile().getParentFile());File newFile = file.getAbsoluteFile().getParentFile();String[] nameList = file.list((dir, name) -> {System.out.println(name + ";");    return (name.endsWith(".txt") || new File(name).isDirectory());});}}
输出结果是:

name : ..absolutepath : E:\Javaworkspace\Chapter15\..absolute parent path : E:\Javaworkspace\Chapter15.metadata;.recommenders;Chapter10;Chapter11;Chapter13;Chapter15;Chapter7;Chapter8;Chapter9;DSAA;HelloEclipse;

第一个现象是:“..”应该打开上一级目录,而FileTest.class文件是在E:\Javaworkspace\Chapter15\bin文件夹下的,所以应该打开的是Chapter15文件夹才对,但是事实上打开的是E:\Javaworkspace\文件夹。之后用cmd运行java TestFile,则打开了Chapter15文件夹,所以看来这是IDE的设置问题。


第二个现象:file的绝对路径并不是想象中的,Chapter15的上一级路径E:\Javaworkspace,反而输出绝对路径的时候结果是

absolutepath : E:\Javaworkspace\Chapter15\..

再输出其父路径:

absolute parent path : E:\Javaworkspace\Chapter15
直接把两个点去掉。。。。。。这样不是相当于变成自己子路径了?


为了验证其父路径到底是指向哪里,用

file.getAbsoluteFile().getParentFile()

将file的parentFile返回给了一个newFile。注意不能直接用file.getParentFile(),因为file是以一个相对路径创建的,相对路径返回其父路径只会返回一个null。

随后把遍历部分改为:

String[] nameList = newFile.list((dir, name) -> {System.out.println(name + ";");    return (name.endsWith(".txt") || new File(name).isDirectory());});
得到结果是:

name : ..absolutepath : E:\Javaworkspace\Chapter15\..absolute parent path : E:\Javaworkspace\Chapter15.classpath;.project;aaa.txt;aaa2869544329262800830.txt;aaa3410582070962516384.txt;aaa3983477344263386816.txt;aaa8644398199006746799.txt;bin;src;

实际上newFile打开的是Chapter15,果真是file的子路径。

猜想

File类是完全以字符串来处理路径名的,比如以两个点创建file,file的绝对路径就是E:\Javaworkspace\Chapter15\..,而要执行操作(比如list)的时候,再去分析这个字符串,找到实际的位置。而file返回父路径时,单纯地,以形式上的去掉最后一集目录的字符串,生成了一个File赋给了newFile,才出现了以上现象,所以对相对路径的各种处理应该格外小心才是


name()方法:在实验过程小试了一下name方法,证明无论如何创建File对象,name返回的都是当前文件夹。比如

File file = new File("..");

则name()返回“..”,如果

File newFile = new File("E:\\Javaworkspace\\Chapter15");
则newFile.name()返回“Chapter15”。


0 0