您的位置:首页 > 其它

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

2015-04-02 22:01 183 查看
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结尾,或者文件对应一个路径,返回true
String[] 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”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: