Java File类 操作目录 操作文件
File
文件和目录路径名的抽象表示形式。
文件:
为了便于数据的管理和检索,引入了“文件”的概念。一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。
一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别,这是从文件的功能进行分类的。从数据存储的角度来说,所有的文件本质上都是一样的,都是由一个个字节组成的,归根到底都是 0、1 比特串。
文件夹(目录):
成千上万个文件如果不加分类放在一起,用户使用起来显然非常不便,因此又引入了树形目录(目录也叫文件夹)的机制,可以把文件放在不同的文件夹中,文件夹中还可以嵌套文件夹,这就便于用户对文件进行管理和使用
- 对于 UNIX 平台,绝对路径名的前缀始终是
"/"
。相对路径名没有前缀。表示根目录的绝对路径名的前缀为"/"
且名称序列为空。- 对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个
":"
组成。如果路径名是绝对路径名,还可能后跟"\\"
。
相对路径与绝对路径
无论是抽象路径名还是路径名字符串,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。相反,相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,
java.io
包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性user.dir
指定,通常是 Java 虚拟机的调用目录。 IDEA中相对路径起始点位于本项目的根目录
- 相对路径:相对于当前文件位置的路径
- 引用上上级文件: …/…/test.txt
- 引用上级文件: …/test.txt
- 引用同级文件: test.txt
- 引用下级文件: dir/test.txt
- 绝对路径
- D:\Documents\study_original_file\dir\test.txt
文件系统可以实现对实际文件系统对象上的某些操作(比如,读、写、执行)进行限制。这些限制统称为访问权限。文件系统可以对一个对象设置多个访问权限。例如,一个设置可能适用于对象的所有者,另一个设置则可能适用于所有其他用户。对象上的访问权限可能导致此类的某些方法执行失败。
File
类的实例是不可变的;也就是说,一旦创建,File
对象表示的抽象路径名将永不改变。
字段摘要
Type | Filed | Description |
static String | pathSeparator | 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
static char | pathSeparatorChar | 与系统有关的路径分隔符。 |
static String | separator | 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 |
static char | separatorChar | 与系统有关的默认名称分隔符。 |
构造器
构造器 | 描述 |
File(File parent, String child) | 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
File(String pathname) | 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) | 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
File(URI uri) | 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 |
方法摘要
介绍File方法之前我们先了解java.io 接口 FilenameFilter(文件名过滤器),其只有一个方法
- boolean accept(File dir, String name)
- 测试指定文件是否应该包含在某一文件列表中。 dir - 被找到的文件所在的目录。name - 文件的名称。
也因此其经常作为匿名类出现,甚至因lambda表达式而深藏功与名
Modifier and Type | Method | Description |
boolean | canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean | canRead() | 测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean | canWrite() | 测试应用程序是否可以修改此抽象路径名表示的文件。 |
int | compareTo(File pathname) | 按字母顺序比较两个抽象路径名。 |
boolean | createNewFile() | 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
static File | createTempFile(String prefix, String suffix) | 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
static File | createTempFile(String prefix, String suffix, File directory) | 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
boolean | delete() | 删除此抽象路径名表示的文件或目录。 |
void | deleteOnExit() | 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
boolean | equals(Object obj) | 测试此抽象路径名与给定对象是否相等。 |
boolean | exists() | 测试此抽象路径名表示的文件或目录是否存在。 |
File | getAbsoluteFile() | 返回此抽象路径名的绝对路径名形式。 |
String | getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串。 |
File | getCanonicalFile() | 返回此抽象路径名的规范形式。 |
String | getCanonicalPath() | 返回此抽象路径名的规范路径名字符串。 |
long | getFreeSpace() | 返回此抽象路径名指定的分区中未分配的字节数。 |
String | getName() | 返回由此抽象路径名表示的文件或目录的名称。 |
String | getParent() | 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 |
File | getParentFile() | 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 |
String | getPath() | 将此抽象路径名转换为一个路径名字符串。 |
long | getTotalSpace() | 返回此抽象路径名指定的分区大小。 |
long | getUsableSpace() | 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 |
int | hashCode() | 计算此抽象路径名的哈希码。 |
boolean | isAbsolute() | 测试此抽象路径名是否为绝对路径名。 |
boolean | isDirectory() | 测试此抽象路径名表示的文件是否是一个目录。 |
boolean | isFile() | 测试此抽象路径名表示的文件是否是一个标准文件。 |
boolean | isHidden() | 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
long | lastModified() | 返回此抽象路径名表示的文件最后一次被修改的时间。 |
long | length() | 返回由此抽象路径名表示的文件的长度。 |
String[] | list() | 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
String[] | list(FilenameFilter filter) | 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] | listFiles() | 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
File[] | listFiles(FileFilter filter) | 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] | listFiles(FilenameFilter filter) | 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
static File[] | listRoots() | 列出可用的文件系统根。 |
boolean | mkdir() | 创建此抽象路径名指定的目录。 |
boolean | mkdirs() | 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
boolean | renameTo(File dest) | 重新命名此抽象路径名表示的文件。 |
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) | 设置此抽象路径名的所有者或所有用户的写权限。 |
String | toString() | 返回此抽象路径名的路径名字符串。 |
URI | toURI() | 构造一个表示此抽象路径名的 file: URI。 |
操作文件
关于创建File实例的方式,IDEA中main方法,相对位置指的就是以整个项目的根路径作为相对路径起点;而在junit的测试方法中,相对路径指的就是模块位置。路径字符串格式故而无法直接使用\
,可使用 \ \
(两个\
)转义,或是`` 作为路径分隔符,在跨系统时也可以使用 File.separator自动决定路径分隔符。
//将文件封装为一个File类的对象:
File f = new File("IOStream/src/testfile/test.txt");
File f1 = new File("D:\\JAVA_FILE\\IntelliJ\\JStudy\\IOStream\\src\\testfile\\test.txt");
File f2 = new File("IOStream\\src\\testfile\\test.txt");
//File.separator属性帮我们获取当前操作系统的路径拼接符号
//在windows,dos下,系统默认用“\”作为路径分隔符 ,在unix,url中,使用“/”作为路径分隔符。
//建议使用这种
File f3 = new File("IOStream"+ File.separator+"src"+ File.separator+"testfile"+ File.separator+"test.txt");//建议使用这种
文件属性相关
public class Testfile {
public static void main(String[] args) throws IOException {
//将文件封装为一个File类的对象:
File f = new File("IOStream/src/testfile/test.txt");
//常用方法:
System.out.println("文件是否可读:"+f.canRead()); //文件是否可读:true
System.out.println("文件是否可写:"+f.canWrite()); //文件是否可写:true
System.out.println("文件的名字:"+f.getName()); //文件的名字:test.txt
System.out.println("上级目录:"+f.getParent()); //上级目录:IOStream\src\testfile
System.out.println("是否是一个目录:"+f.isDirectory()); //是否是一个目录:false
System.out.println("是否是一个文件:"+f.isFile()); //是否是一个文件:true
System.out.println("是否隐藏:"+f.isHidden()); //是否隐藏:false
System.out.println("文件的大小:"+f.length()); //文件的大小:16
System.out.println("是否存在:"+f.exists()); //是否存在:true
}
}
文件路径相关
public class Testfile {
public static void main(String[] args) throws IOException {
//将文件封装为一个File类的对象:
File f = new File("IOStream/src/testfile/test.txt");
File f1 = new File("IOStream/src/testfile/test.txt");
File f2 = new File("D:\\JAVA_FILE\\IntelliJ\\JStudy\\IOStream\\src\\testfile\\test.txt");
System.out.println(f == f1);//比较两个对象的地址
System.out.println(f.equals(f1));//比较两个对象对应的文件的路径
System.out.println(f.equals(f2));//比较两个对象对应的文件的路径
//跟路径相关的:
//绝对路径指的就是:真实的一个精准的,完整的路径
System.out.println("绝对路径:"+f.getAbsolutePath());//绝对路径:D:\JAVA_FILE\IntelliJ\JStudy\IOStream\src\testfile\test.txt
//相对路径:有一个参照物,相对这个参照物的路径。
System.out.println("相对路径:"+f.getPath()); //相对路径:IOStream\src\testfile\test.txt
//toString的效果永远是 相对路径
System.out.println("toString:"+f.toString()); //toString:IOStream\src\testfile\test.txt
}
}
文件创建
public class Testfile {
public static void main(String[] args) throws IOException {
File f = new File("IOStream\\src\\testfile\\demo.txt");
boolean flag = f.exists();
if(!flag){//如果文件不存在,就创建文件
f.createNewFile();
System.out.println("chuanjian1");
}
if(f.exists()){//如果文件存在,将文件删除
f.delete();
}
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("相对路径:"+f.getPath());
File f2 = new File("IOStream\\src\\testfile\\de\\mo\\demo.txt");
f2.createNewFile();//Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
}
}
操作目录
目录属性
public class Testdir {
public static void main(String[] args) {
//将目录封装为File类的对象:
File f = new File("IOStream/src/testfile");
System.out.println("目录是否可读:"+f.canRead());
System.out.println("目录是否可写:"+f.canWrite());
System.out.println("目录的名字:"+f.getName());
System.out.println("上级目录:"+f.getParent());
System.out.println("是否是一个目录:"+f.isDirectory());
System.out.println("是否是一个文件:"+f.isFile());
System.out.println("是否隐藏:"+f.isHidden());
System.out.println("目录的大小:"+f.length());
System.out.println("是否存在:"+f.exists());
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("相对路径:"+f.getPath());
System.out.println("toString:"+f.toString());
}
}
目录创建
public class Testdir {
public static void main(String[] args) {
File f = new File("IOStream/src/testfile");
//创建目录:
File f2 = new File("IOStream/src/testfile/a");
System.out.println(f2.mkdir());// true 单层目录
File f3 = new File("IOStream/src/testfile/a/b/c");
System.out.println(f3.mkdirs());// true 多层目录
/*删除:如果是删除目录的话,只会删除一层
并且前提:这层目录是空的,里面没有内容,如果内容就不会被删除*/
System.out.println(f3.delete());// true
}
}
目录遍历
public class ListDir {
public static void main(String[] args) {
//查看:
File f = new File("IOStream/src/testfile");
String[] list = f.list();//文件夹下目录/文件对应的名字的数组
for(String s:list){
System.out.println(s);
/* a
demo.java
test.txt*/
}
System.out.println("----------------");
File[] files = f.listFiles();//作用更加广泛
for(File file:files){
System.out.println(file.getName()+","+file.getAbsolutePath());
/* a,D:\JAVA_FILE\IntelliJ\JStudy\IOStream\src\testfile\a
demo.java,D:\JAVA_FILE\IntelliJ\JStudy\IOStream\src\testfile\demo.java
test.txt,D:\JAVA_FILE\IntelliJ\JStudy\IOStream\src\testfile\test.txt*/
}
System.out.println("----------------");
//使用 FilenameFilter接口lambda形式选择指定格式文件
File[] fileName = f.listFiles(name -> name.getName().endsWith(".java"));
for(File file:fileName){
System.out.println(file.getName()); //demo.java
}
}
}