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的例子:
再看以下代码:
第一个现象是:“..”应该打开上一级目录,而FileTest.class文件是在E:\Javaworkspace\Chapter15\bin文件夹下的,所以应该打开的是Chapter15文件夹才对,但是事实上打开的是E:\Javaworkspace\文件夹。之后用cmd运行java TestFile,则打开了Chapter15文件夹,所以看来这是IDE的设置问题。
第二个现象:file的绝对路径并不是想象中的,Chapter15的上一级路径E:\Javaworkspace,反而输出绝对路径的时候结果是
再输出其父路径:
为了验证其父路径到底是指向哪里,用
将file的parentFile返回给了一个newFile。注意不能直接用file.getParentFile(),因为file是以一个相对路径创建的,相对路径返回其父路径只会返回一个null。
随后把遍历部分改为:
实际上newFile打开的是Chapter15,果真是file的子路径。
猜想:
File类是完全以字符串来处理路径名的,比如以两个点创建file,file的绝对路径就是E:\Javaworkspace\Chapter15\..,而要执行操作(比如list)的时候,再去分析这个字符串,找到实际的位置。而file返回父路径时,单纯地,以形式上的去掉最后一集目录的字符串,生成了一个File赋给了newFile,才出现了以上现象,所以对相对路径的各种处理应该格外小心才是
name()方法:在实验过程小试了一下name方法,证明无论如何创建File对象,name返回的都是当前文件夹。比如
则name()返回“..”,如果
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”。
相关文章推荐
- JAVA学习中的一点小发现:LinkedList中.poll()方法在输出时使用应注意的小点
- java之io之File类的list()方法过滤目录的使用
- 使用 File 类中的 list 方法所遇到的状况
- [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法
- C#开发里List控件的使用方法介绍
- Symbian S60开发,在SettingList中使用RadioButton的问题及解决方法。
- windowform下 richTextBox+openFileDialog+saveFileDialog的使用方法 + 控件不获取焦点时自动关闭
- list中的Find方法使用
- 使用输出重载时发现的一个奇怪现象!!!
- [导入]使用Sharepoint的Lists Web Service调用UpdateListItems方法"增/删/改"List Items
- richTextBox+openFileDialog+saveFileDialog的使用方法
- VB.Net + asp.net的一个web系统,使用SQL2000数据库 现在运行时偶尔会出现一个奇怪现象,一个用户登录时,登录后的界面竟然是另一个用户
- ASP中使用FileSystemObject时提高性能的方法
- 使用CuteFTP登陆FTP(serv-U)服务器后无法LIST目录和文件的解决方法
- 使用CuteFTP登陆FTP(serv-U)服务器后无法LIST目录和文件的解决方法
- 理解va_list、va_start、va_arg、va_end原理及使用方法
- IIS中使用PHP的SESSION的一个奇怪现象
- TValueListEditor 控件使用方法
- 使用WebClient.UpLoadFile方法在C/S程序中上传文件
- 使用CuteFTP登陆FTP(serv-U)服务器后无法LIST目录和文件的解决方法