文章目录
- 前言
- 一、File类简介
- 二、公共静态字段
- 三、构造方法
- 成员方法
- 成员方法简述
- 常用成员方法详解
前言
Java API提供的文件和目录路径名的抽象表示,访问、操作文件系统的对象。
一、File类简介
- File类实现了Serializable和Comparable两个接口。
- File类的实例可以表示或不表示实际的文件系统对象,例如文件或目录。 如果它表示这样一个对象,那么该对象驻留在一个分区中 。 分区是文件系统的特定于操作系统的存储部分。 单个存储设备(例如物理磁盘驱动器,闪存,CD-ROM)可能包含多个分区。 该对象(如果有的话)将驻留在该路径名的绝对形式的一些分区named上。
- 文件系统可以对实际的文件系统对象上的某些操作实施限制,例如读取,写入和执行。 这些限制统称为访问权限 。 文件系统对单个对象可以具有多组访问权限。 例如,一组可能适用于对象的所有者 ,另一组可能适用于所有其他用户。 对象的访问权限可能会导致此类中的某些方法失败。
- File类的实例是不可变的; 也就是说,一旦创建,由File对象表示的抽象路径名永远不会改变。
二、公共静态字段
Modifier | Type | Field | Description |
static | String | pathSeparator | 与系统相关的路径分隔符字符,为方便起见,表示为字符串。 |
static | char | pathSeparatorChar | 与系统相关的路径分隔符。 |
static | String | separator | 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。 |
static | char | separatorChar | 与系统相关的默认名称分隔符。 |
- pathSeparator
和pathSeparatorChar
在UNIX系统上,这个字符是’:’ ; 在Microsoft Windows系统上它是’;’ 。
下面是jdk源码,pathSeparator是将pathSeparatorChar转成字符串后的值。
public static final String pathSeparator = "" + pathSeparatorChar;
- separator 和 separatorChar
在UNIX系统上,该字段的值为’/’ ; 在Microsoft Windows系统上是’\’ 。
separator 是将separatorChar转为字符串后的值。
public static final String separator = "" + separatorChar;
三、构造方法
File类共有4个构造方法进行实例化对象:
Constructor | Description |
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
File(URI uri) | 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。 |
- File(String pathname)
我们最常用的构造方法是File(String pathname),通过给定的pathName创建File对象。
接下开看下代码示例:
public static void ConstructorTest(){
//在F盘下创建fild1.txt 文件
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"file1.txt";
File file1 = new File(path);
System.out.println("file1对象:" + file1);
//控制台输出 file1对象:F:\Java Learning Notes\fileLearn\file1.txt
}
- File(File parent, String child)
public static void ConstructorTest2(){
//子路径
String chaildPath = "fileLearn" + File.separator + "file1.txt";
//父路径
String parentPath = "F:" + File.separator + "Java Learning Notes";
File parentFild = new File(parentPath);
File childFile = new File(parentFild,chaildPath);
System.out.println("parentFild对象:" + parentFild);
System.out.println("filechildFile对象:" + childFile);
//parentFild对象:F:\Java Learning Notes
//filechildFile对象:F:\Java Learning Notes\fileLearn\file1.txt
}
- File(String parent, String child)
public static void ConstructorTest3(){
//子路径
String chaildPath = "fileLearn" + File.separator + "file1.txt";
//父路径
String parentPath = "F:" + File.separator + "Java Learning Notes";
File childFile = new File(parentPath,chaildPath);
System.out.println("filechildFile对象:" + childFile);
//filechildFile对象:F:\Java Learning Notes\fileLearn\file1.txt
}
- File(URI uri)
public static void ConstructorTest4() throws Exception {
File file = new File(new URI("file:///F:/JavaLearningNotes/fileLearn/file1.txt"));
System.out.println("file对象:" + file);
//file对象:F:\Java Learning Notes\fileLearn\file1.txt
}
成员方法
以下是File的成员方法展示和常用成员方法代码样例展示。存在代码样例的是会进行详细讲解,其他成员方法有兴趣的可以自己敲下代码实现。
成员方法简述
modifier and Type | Method | Description | 代码样例 |
int | compareTo(File pathname) | 比较两个抽象的路径名字典。 | 点击跳转 |
boolean | createNewFile() | 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 | 点击跳转 |
boolean | isDirectory() | 测试此抽象路径名表示的文件是否为目录。 | 点击跳转 |
boolean | isFile() | 测试此抽象路径名表示的文件是否为普通文件。 | 点击跳转 |
boolean | exists() | 测试此抽象路径名表示的文件或目录是否存在。 | 点击跳转 |
boolean | mkdir() | 创建由此抽象路径名命名的目录。 | 点击跳转 |
boolean | mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 | 点击跳转 |
File[] | listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 | 点击跳转 |
boolean | delete() | 删除由此抽象路径名表示的文件或目录。 | 点击跳转 |
String | getPath() | 将此抽象路径名转换为路径名字符串。 | |
boolean | canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件。 | |
boolean | canRead() | 测试应用程序是否可以读取由此抽象路径名表示的文件。 | |
boolean | canWrite() | 测试应用程序是否可以修改由此抽象路径名表示的文件。 | |
boolean | renameTo(File dest) | 重命名由此抽象路径名表示的文件。 | |
static File | createTempFile(String prefix, String suffix) | 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。 | |
static File | createTempFile(String prefix, String suffix, File directory) | 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 | |
void | deleteOnExit() | 请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。 | |
boolean | equals(Object obj) | 测试此抽象路径名与给定对象的相等性。 | |
File | getAbsoluteFile() | 返回此抽象路径名的绝对形式。 | |
String | getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串。 | |
File | getCanonicalFile() | 返回此抽象路径名的规范形式。 | |
String | getCanonicalPath() | 返回此抽象路径名的规范路径名字符串。 | |
long | getFreeSpace() | 返回分区未分配的字节数 named此抽象路径名。 | |
String | getName() | 返回由此抽象路径名表示的文件或目录的名称。 | |
String | getParent() | 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。 | |
File | getParentFile() | 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。 | |
long | getTotalSpace() | 通过此抽象路径名返回分区 named的大小。 | |
long | getUsableSpace() | 返回上的分区提供给该虚拟机的字节数 named此抽象路径名。 | |
int | hashCode() | 计算此抽象路径名的哈希码。 | |
boolean | isAbsolute() | 测试这个抽象路径名是否是绝对的。 | |
boolean | isHidden() | 测试此抽象路径名命名的文件是否为隐藏文件。 | |
long | lastModified() | 返回此抽象路径名表示的文件上次修改的时间。 | |
long | length() | 返回由此抽象路径名表示的文件的长度。 | |
String[] | list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 | |
String[] | list(FilenameFilter filter) | 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 | |
File[] | listFiles(FileFilter filter) | 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 | |
File[] | listFiles(FilenameFilter filter) | 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 | |
boolean | setExecutable(boolean executable) | 为此抽象路径名设置所有者的执行权限的便利方法。 | |
boolean | setExecutable(boolean executable, boolean ownerOnly) | 设置该抽象路径名的所有者或每个人的执行权限。 | |
boolean | setLastModified(long time) | 设置由此抽象路径名命名的文件或目录的最后修改时间。 | |
boolean | setReadable(boolean readable) | 一种方便的方法来设置所有者对此抽象路径名的读取权限。 | |
boolean | setReadable(boolean readable, boolean ownerOnly) | 设置此抽象路径名的所有者或每个人的读取权限。 | |
boolean | setReadOnly() | 标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 | |
boolean | setWritable(boolean writable) | 一种方便的方法来设置所有者对此抽象路径名的写入权限。 | |
boolean | setWritable(boolean writable, boolean ownerOnly) | 设置此抽象路径名的所有者或每个人的写入权限。 | |
Path | toPath() | 返回从此抽象路径构造的java.nio.file.Path对象。 | |
String | toString() | 返回此抽象路径名的路径名字符串。 | |
URI | toURI() | 构造一个表示此抽象路径名的 file: URI。 |
常用成员方法详解
- compareTo(File pathname)
如果参数等于此抽象路径名,则为零,如果此抽象路径名在字典上小于参数,则小于零的值,或者如果此抽象路径名在词法上大于参数,则该值大于零
代码样例如下:
public static void MtthodTest() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"file.txt";
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"file.txt";
String path2 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"file2.txt";
File file = new File(path);
File file1 = new File(path1);
File file2 = new File(path2);
//路径相同
System.out.println(file.compareTo(file1));
//file路径小于file2
System.out.println(file.compareTo(file2));
//控制台返回
//0
//-4
}
- createNewFile()
当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 检查文件的存在和文件的创建(如果不存在)是对可能影响文件的所有其他文件系统活动是单一的操作。如上图,fileLearn目录下是空的,那么执行createNewFile()方法后会怎么?
代码样例如下:
public static void methodTest1() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1"+File.separator+"file.txt";
File file = new File(path);
File file1 = new File(path1);
//文件路径存在
System.out.println(file.createNewFile());
//文件路径不存在
System.out.println(file1.createNewFile());
}
首先看下执行结果,file调用createNewFile()返回true,但是file1抛出异常“java.io.IOException: 系统找不到指定的路径。”。找不到指定路径。
file创建的空文件。
所以,createNewFile()方法只能创建文件,不会创建路径,创建文件前必须校验目录存在,否在会抛出找IOException():找不到指定文件
如果文件已经存在,继续执行会返回false,不会重复创建。
- isDirectory()
测试此抽象路径名表示的文件是否为目录。结果: true当且仅当该抽象路径名表示的文件存在且为目录时; false相反。
public static void methodTest2() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1";
String path2 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator;
File file = new File(path);
File file1 = new File(path1);
File file2 = new File(path2);
//判断文件是否目录
System.out.println(file.isDirectory()); // 结果 : false
System.out.println(file1.isDirectory()); // 结果 : false
System.out.println(file2.isDirectory()); // 结果 : true
}
文件状态为上一步执行后的文件状态。
- isFile()
测试此抽象路径名表示的文件是否为普通文件。结果:true当且仅当该抽象路径名表示的文件存在且为普通文件时; false相反。
代码样例如下:
public static void methodTest3() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1";
File file = new File(path);
File file1 = new File(path1);
//判断文件是否普通文件
System.out.println(file.isFile()); // 结果 : true
System.out.println(file1.isFile()); // 结果 : false
}
- exists()
测试此抽象路径名表示的文件或目录是否存在。结果true:当且仅当存在由此抽象路径名表示的文件或目录;false:不存在由此抽象路径名表示的文件或目录。
代码样例如下:
public static void methodTest4() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
String path01 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest2.txt";
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator;
String path2 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1";
File file = new File(path);
File file01 = new File(path01);
File file1 = new File(path1);
File file2 = new File(path2);
//判断文件或目录是否存在
System.out.println(file.exists()); // 结果 : true
System.out.println(file01.exists()); // 结果 : false
System.out.println(file1.exists()); // 结果 : true
System.out.println(file2.exists()); // 结果 : false
}
- mkdir()
创建由此抽象路径名命名的目录。结果:true当且仅当该目录被创建时; false相反。
示例代码如下:
public static void methodTest5() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator;
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1" + File.separator+"methodTest2" ;
String path2 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1" ;
File file = new File(path);
File file1 = new File(path1);
File file2 = new File(path2);
//判断目录是否存在,
System.out.println(file.mkdir()); // 结果 : false
System.out.println(file1.mkdir()); // 结果 : false
System.out.println(file2.mkdir()); // 结果 : true
System.out.println(file1.mkdir()); // 结果 : true
}
mkdir()方法无法创建父目录,当父目录不存在时则会返回false
- mkdirs()
创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 请注意,如果此操作失败,它可能已成功创建一些必需的父目录。结果: true当且仅当该目录已创建,以及所有必需的父目录; false相反。
将文件路径还原:
示例代码如下:
public static void methodTest5() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator;
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1" + File.separator+"methodTest2" ;
String path2 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1" ;
File file = new File(path);
File file1 = new File(path1);
File file2 = new File(path2);
//创建目录
System.out.println(file.mkdirs()); // 结果 : false
System.out.println(file1.mkdirs()); // 结果 : true
System.out.println(file2.mkdirs()); // 结果 : false
System.out.println(file1.mkdirs()); // 结果 : false
}
对于mkdirs()会将父级目录一并创建
- listFiles()
返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
如果此抽象路径名不表示目录,则此方法返回null 。 否则将返回一个File对象的数组。 表示目录本身和目录的父目录的路径名不包括在结果中。 每个生成的抽象路径名由使用File(File, String)构造函数的抽象路径名构造。 因此,如果这个路径名是绝对的,那么每个生成的路径名是绝对的; 如果此路径名是相对的,那么每个生成的路径名将相对于相同的目录。
示例代码如下:
public static void methodTest5() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator;
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
File file = new File(path);
File file1 = new File(path1);
for (File listFile : file.listFiles()) {
System.out.println("file :" + listFile.getAbsolutePath());
}
//结果:
//file :F:\Java Learning Notes\fileLearn\methodTest1
//file :F:\Java Learning Notes\fileLearn\methodTest1.txt
for (File listFile : file1.listFiles()) {
System.out.println("file :" + listFile.getAbsolutePath());
}
/* Exception in thread "main" java.lang.NullPointerException
at file.FildLearn.methodTest5(FildLearn.java:37)
at file.FildLearn.main(FildLearn.java:25)*/
}
将子路径和子路径下的文件全部返回。
若file不表示一个目录,则会抛出NullPointerException
- delete()
删除由此抽象路径名表示的文件或目录。 如果此路径名表示目录,则目录必须为空才能删除。 true:当且仅当文件或目录被成功删除时; false相反。
示例代码执行前当前目录:
示例代码如下:
public static void methodTest5() throws Exception {
String path1 = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1.txt";
File file1 = new File(path1);
System.out.println(file1.delete()); //结果 true
}
示例代码执行后,methodTest1.txt文件被删除。
若传入的时目录:
示例代码如下:
public static void methodTest5() throws Exception {
String path = "F:"+ File.separator +"Java Learning Notes"+File.separator+"fileLearn"+File.separator+"methodTest1";
File file = new File(path);
if (!file.exists()){
System.out.println(file.mkdirs()); // true
}
path = path + File.separator+ "methodTest2.txt";
File file1 = new File(path);
if (!file1.exists()){
System.out.println(file1.createNewFile());
}
//System.out.println(file.delete()); //false
//System.out.println(file1.delete()); //true
}
未执行delete()方法时;
执行delete()方法后:
System.out.println(file.delete()); //false
System.out.println(file1.delete()); //true
delete只可以删除空路径或文件