File类方法
继承关系
字段
构造函数
判断方法
详细说明:
创建文件或目录方法
当文件不存在时创建该文件
当目录不存在时创建该目录:
删除文件或目录
获取文件信息方法
路径相关方法
返回目录列表
6.代码实例
(1)构造函数实例:
(2)创建文件或目录实例:
(3)判断文件函数:exists(),isFile(),isAbsolute(),isDirectory(),canRead(),canWrite(),isHidden()
(4)获取,操作文件属性函数
7.有些困惑的地方
(3) list()和listFile()的区别
(4)使用listFiles()函数,递归遍历所有的目录:
8.文件过滤器FilenameFilter接口
一、FilenameFilter介绍
File类简介
File
是java.io
包下面的一个类,代表与平台无关的文件或者目录。Java
中,无论文件还是目录,都可以看作File
类的一个对象。File
类能对文件或目录新建,删除,获取属性等操作,但是不能直接操作文件内容(文件内容需要用数据流访问)。也就是File
类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。
JVM
默认会将workspace
作为相对路径,即user.dir
系统变量所指路径, 即如果这样初始化file
对象,File file = new File(".");
就是获取了user.dir
路径。
File类方法
继承关系
1 | java.lang.Object |
字段
方法 | 描述 |
---|---|
static String pathSeparator |
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
static char pathSeparatorChar |
与系统有关的路径分隔符。 |
static String separator |
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 |
static char separatorChar |
与系统有关的默认名称分隔符。 |
其中常用的是第三个File.separator
,这个表示与系统相关的路径分隔符,因为在Windows下的路径分隔符为:\
而在Linux下的路径分隔符为:/
,所以当直接使用”\
“或者”/
“时作为路径分隔符时,在跨平台使用时会报No Such file or diretory
异常。
所以需要跨平台使用时,应该使用File.separator
作为路径分隔符。
例如window下平常使用路径为:1
File file=new File(".\\test\\demo.txt");
应该改为:1
File file = new File("."+ File.separator +"demo.txt");
这样编译好的代码可以在linux中正常运行。
1 | package test.before; |
首先在工程目录下创建以名为gbk.txt
的文件
Window中的输出结果:1
2D:\dev\workspace\IO\.\gbk.txt
true
Linux中的输出结果:1
2/home/lan/桌面/java/test/./gbk.txt
true
可以看到虽然文件分隔符都不一样的使用了File.separator
可以跨平台。如果改成File file=new File(".\\gbk.txt");
将在Linux中运行出错。1
2/home/lan/桌面/java/test/.\gbk.txt
false
构造函数
方法 | 描述 |
---|---|
File(String pathname); |
根据字符串路径来创建File对象 |
File(String parent, String child) ; |
根据父路径字符串,和文件或者目录名来创建File对象 |
File(File parent, String child); |
根据父路径的File对象,和子文件(子目录)的名称来创建File对象 |
判断方法
方法 | 描述 |
---|---|
public boolean exists() |
判断文件或目录是否存在 |
public boolean isFile() |
判断该File对象是不是一个文件 |
public boolean isDirectory() |
判断该File对象是不是目录 |
public boolean isAbsolute() |
判断该File对象是不是绝对路径 |
public boolean canRead() |
判断程序是否可读该文件 |
public boolean canWrite() |
判断程序是否可写该文件 |
public boolean isHidden() |
判断该文件是不是隐藏文件 |
详细说明:
public boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
返回:
当且仅当此抽象路径名表示的文件或目录存在时,返回 true
;否则返回 falsepublic boolean isFile()
测试此抽象路径名表示的文件是否是一个标准文件
。如果该文件不是一个目录,并且满足其他与系统有关的标准,那么该文件是标准 文件。由 Java 应用程序创建的所有非目录文件一定是标准文件。
返回:
当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true
;否则返回 false 。public boolean isDirectory()
测试此抽象路径名表示的文件是否是一个目录
。
返回:
当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true
;否则返回 false
所以,这三个方法都会去判断文件是否存在,isFile()和isDirectory()会在文件存在的基础之上判断该文件是标准文件还是目录
public boolean isAbsolute()
测试此抽象路径名是否为绝对路径名。绝对路径名的定义与系统有关。
- 在 UNIX 系统上,如果路径名的前缀是 “/“,那么该路径名是绝对路径名。
- 在 Microsoft Windows 系统上,如果路径名的前缀是后跟 “\“ 的盘符,或者是 “\\“,那么该路径名是绝对路径名。
返回:
如果此抽象路径名是绝对路径名,则返回 true;否则返回 false
public boolean canRead()
测试应用程序是否可以读取此抽象路径名表示的文件。
返回:
当且仅当此抽象路径名指定的文件存在且 可被应用程序读取时,返回 true;否则返回 false
public boolean isHidden()
测试此抽象路径名指定的文件是否是一个隐藏文件。隐藏 的具体定义与系统有关
- 在 UNIX 系统上,如果文件名以句点字符 (‘.’) 开头,则认为该文件被隐藏。
- 在 Microsoft Windows 系统上,如果在文件系统中文件被标记为隐藏,则认为该文件被隐藏。
返回:
当且仅当此抽象路径名表示的文件根据底层平台约定是隐藏文件时,返回 true
总结:我还是应该多看看API
创建文件或目录方法
方法 | 描述 |
---|---|
boolean createNewFile() |
当文件不存在的时候创建一个文件。如果指定的文件不存在则创建,则返回 true;如果指定的文件已经存在,则返回 false |
boolean mkdir(); |
创建一个该抽象路径对应的目录,如果新建的目录的上级目录不存在则mkdir()回报异常,创建文件夹 |
boolean mkdirs(); |
创建多级目录,创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。 |
实例:
当文件不存在时创建该文件
1 | File file=new File("file2.txt"); |
当目录不存在时创建该目录:
1 | File file=new File("file2.txt"); |
删除文件或目录
方法 | 描述 |
---|---|
boolean delete(); |
删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。 |
获取文件信息方法
方法 | 描述 |
---|---|
public long length() |
返回文件的大小 以字节为单位;如果文件不存在,则返回 0L。对于表示特定于系统的实体比如设备或管道)的路径名,某些操作系统可能返回0L |
public String getName() |
返回由此File对象表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。 |
public long lastModified() |
返回文件最后一次被修改的时间,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示; |
public boolean renameTo(File dest) |
重命名该文件为dest.如果文件名为dest的文件不存在 |
路径相关方法
方法 | 描述 |
---|---|
public String getParent() |
返回父路径名称字符串 |
public File getParentFile() |
返回父路径的File对象 |
public String getPath(); |
获取相对路径字符串 |
public String getAbsolutePath(); |
获取绝对路径字符串。 |
public String getCanonicalPath(); |
返回规范化路径字符串 |
public File getAbsoluteFile(); |
返回此File对象的副本?等同于new File(this.getAbsolutePath()) |
返回目录列表
方法 | 描述 |
---|---|
public String[] list() |
获取该目录下的文件或目录名的字符串列表,如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个字符串数组,每个数组元素对应目录中的每个文件名或目录名 |
public File[] listFiles() |
获取该目录下面的所有文件或者目录的File对象列表,如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个File对象数组,每个数组元素对应目录中的每个文件或目录的File对象 |
6.代码实例
(1)构造函数实例:
1 | public static void main(String[] args) |
运行结果:1
2
3
4D:\a\1.txt
D:\a\2.txt
D:\a
D:\a\3.txt
(2)创建文件或目录实例:
1 | public class FileDemo1 |
结果:
1) 第一次运行的时候,尚未创建文件或目录。1
2
3
4
5
6创建目录-D:\a
true
创建多级目录-D:\a\test1\test2
true
创建文件-D:\a\file.txt
true
分析:全部创建成功
2) 第2次运行,文件和目录以及多级目录都创建成功了。
1 | 删除目录-D:\a\test1\test2 |
分析:
文件file可以删除掉,而目录directory(D:\a)不是空目录,无法删除。目录dir(D:\a\test1\test2) test2下面没有目录和文件,可以删除掉目录test2,delete()函数只能删除掉最下面的目录test2,不会删除掉test2的父目录test1.这与mkdirs()函数不是互逆操作。
(3)判断文件函数:exists(),isFile(),isAbsolute(),isDirectory(),canRead(),canWrite(),isHidden()
代码验证:
1 | public class FileDemo2 |
运行结果:1
2
3
4
5
6
7
8file对象是否是文件:true
dir对象是否是目录:true
file对象的路径是否是绝对路径: true
noAbsolute对象的路径是否是绝对路径: false
file.txt是否存在:true
file.txt是否可读:true
file.txt是否可写:true
file.txt是否是隐藏文件:false
(4)获取,操作文件属性函数
lastModified(),length(),getName(),getParent(),getPath(),getAbsolutePath():
1 | public class FileAPIDemo1 |
运行结果:
1 | file.txt最后一次修改的时间:2018-05-03 16:15:00 |
7.有些困惑的地方
(1)getAbsoluteFile()函数其实就是获取当前File对象的一个副本?
(2)规范化路径getCanonicalPath(),相对路径getPath(),绝对路径getAbsolutePath()三者的区别:
1)当输入为绝对路径时,3个方法返回的都是绝对路径。
2)当输入为相对路径时:
getPath() 返回的是File构造方法里的路径
getAbsolutePath() 返回的其实是user.dir+getPath()的内容
getCanonicalPath() 返回的是去掉多余点号(.)等的规范化路径
测试代码:
1 | public class FileDemo3 |
(3) list()和listFile()的区别
看返回类型就知道了:
list()函数获取的是当前目录下的所有文件和目录的名字列表(String数组)
listFiles()获取的是当前目录下面的所有文件和目录的File对象列表(File数组)。
测试代码:
1 | public class FileAPIDemo2 |
运行结果:
1 | .classpath |
(4)使用listFiles()函数,递归遍历所有的目录:
1 | public class FileAPIDemo4 |
运行结果:
1 | D:\dev\workspace\TestLearned\.classpath |
分析:可以看到当前工程下的所有目录中的文件和目录都已经遍历了一遍,通过这样递归遍历整个目录可以用来拷贝整个目录
8.文件过滤器FilenameFilter接口
看下面的File类的方法:
[java] view plain copy
<code class="language-java">public String[] list(FilenameFilter filter) ; //返回一个字符串数组,这些字符串是目录中满足指定过滤器的文件和目录名字符串。
public File[] listFiles(FilenameFilter filter);
//返回File数组,数组中的元素是该目录下的所有满足指定过滤器filter的文件和目录的File对象</code>
上述方法可以实现文件过滤,返回符合条件的文件,过滤掉不符合条件的文件(不返回)
一、FilenameFilter介绍
java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件;
一般地:
(1)String[] fs = f.list();
(2)File[] fs = f.listFiles();
这两个方法返回f下的所有文件或目录;
FilenameFilter用来返回符合要求的文件或目录,不符合的文件的目录不返回(过滤掉);
因此可以调用:
(1)String []fs = f.list(FilenameFilter filter);
(2)File[]fs = f.listFiles(FilenameFilter filter);
FilenameFilter中有一个方法:
boolean accept(File dir,String name); //dir表示文件的当前目录,name表示文件名;
实现该方法即可对文件进行过滤:
使用方式:
(1)使用匿名内部类
(2)实现FilenameFilter
代码实现:
(1)匿名内部类方式实现文件过滤:
1 | public static void printAllFile(File dir,final String ends) |
(2)实现FilenameFilter方式实现文件过滤:
1 | //静态内部类可以直接new不用加上外部类的类名 |
完整代码:
1 | import java.io.File; |
运行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17当前目录下的所有java文件:
FileAPIDemo1.java
FileAPIDemo2.java
FileAPIDemo4.java
FileDemo.java
FileDemo1.java
FileDemo2.java
FileDemo3.java
FilenameFilterTest.java
TestFile.java
TestGBK.java
-----------------------------------------------
当前目录下的所有txt文件:
Test.txt
-----------------------------------------------
当前目录下的所有txt文件:
Test.txt
可以看到上面两种方式都能实现根据后缀名来过滤目录下面的文件,匿名内部类的方式比较适合于临时使用的情况,实现接口的方式比较适合于多次重复使用的情况。
参考:
JAVA基础知识之IO-File类
FilenameFilter总结