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”。
- 18、File类使用list方法的一点奇怪现象
- File,fopen, fclose 和 read的奇怪现象
- java Calendar类 一个奇怪的现象
- 求救!!!奇怪的现象!
- 奇怪的现象
- noskipws()的奇怪现象!
- 好奇怪的现象
- 奇怪的UNION现象
- java的奇怪现象
- 奇怪的现象
- 使用 File 类中的 list 方法所遇到的状况
- 使用输出重载时发现的一个奇怪现象!!!
- 关于Oracle日期转换的一点小经验:运用union的一种奇怪现象及解决
- 关于Session的奇怪现象
- 关于Session的奇怪现象
- hql一个奇怪的现象
- windows的又一个奇怪现象
- process explorer的奇怪现象
- 有符号和无符号之间的转换
- 详细分析system_call
- P51-10
- 关于 ios 7.0启用的UINavgationViewController的interactivePopGestureRecognizer手势
- (转)Asp.Net 使用“递归算法”生成目录树的JSON格式(值得收藏) 以下博文转自:http://www.cnblogs.com/yangrixing/archive/2012/08/23/26
- 18、File类使用list方法的一点奇怪现象
- 输出闰年
- iOS传值总结
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- import com.sun.image.codec.jpeg.JPEGImageEncoder报错解决办法
- 程序员关系数据库——OceanBase
- 阿里2015 实习笔试题笔记 分布式系统中的RPC请求经常出现乱序的情况
- [LeetCode][169][Majority Element]
- 设计模式学习(九):组合模式