目录
1.File 类的概述
存储在变量、数组和对象中的数据是暂时的,当程序终止时他们就会丢失。为了能够永久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中,这些文件可以移动、传输,亦可以被其他程序使用,Java 中为我们提供了一个专门用于操作文件和文件夹的实体类 File 类,这是一个与操作系统无关的类,任何的操作系统都可以使用此类操作文件。
File 类以抽象的方式代表文件名和目录路径名,只是记录了文件和目录的引用地址,但并不代表具体的文件或者目录。因此实例化一个 File 对象并不等于创建了一个文件,而是记录了一个引用地址,若想创建和删除文件必须根据 File 所记录的引用地址调用系统本地方法来执行操作。
2.File 类的静态属性与构造方法
(1)绝对路径与相对路径
绝对路径:以盘符开头的完整的路径,如 D:\ java-2018-12 \ idea 。系统检索路径时一定会从盘符开始自上往下检索。
相对路径:简化的路径,一般不写盘符,文件位置是相对而言的。系统在检索路径时会从当前所在的根目录开始检索。
(2)静态属性
static String | pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 |
static String | separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 |
在文件路径名中,存在两种分隔符:一种用来分割不同的路径名,称之为路径分隔符,Windows 中用分号表示,而 Linux 中用冒号表示; 另一种用来分割同一路径名层次结构,称之为文件名称分隔符,Windows 中用反斜杠表示,而 Linux 中用正斜杠表示。
上面 File 中的两个静态属性正好对应了这两种分隔符,下面打印一下这两个分隔符:
System.out.println("Windows路径分隔符:" + File.pathSeparator);
System.out.println("Windows文件名称分隔符:" + File.separator);
Windows路径分隔符:;
Windows文件名称分隔符:\
(3)构造方法
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
//1.第一个构造方法
File directory = new File("D:\\testDirectory");
//2.第二个构造方法
File file1 = new File(directory,"file1.xml");
//3.第三个构造方法
File file2 = new File("D:\\testDirectory","file2.xml");
3.File 类常用方法
(1)操作文件
boolean | createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
boolean | delete() 删除此抽象路径名表示的文件或目录。 |
boolean |
|
首先使用相对路径在当前项目的 day08 包中创建一个文件:
//1.相对路径在当前项目中创建文件
File file = new File("src\\com\\java\\day08\\file.xml");
//2.判断文件是否存在
System.out.println(file.exists());//false
//3.在当前路径创建文件
boolean flag = file.createNewFile();//true
//4.判断文件是否存在
System.out.println(file.exists());//true
删除上面创建的文件:
//1.判断文件是否存在
System.out.println(file.exists());//true
//2.删除创建的文件
file.delete();
//3.判断文件是否存在
System.out.println(file.exists());//false
(2)文件信息获取
boolean | isAbsolute() 测试此抽象路径名是否为绝对路径名。 |
String | getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
String | getPath() 将此抽象路径名转换为一个路径名字符串。 |
long | length() 返回由此抽象路径名表示的文件的长度。 |
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String | toString() 返回此抽象路径名的路径名字符串,默认调用 getPath() 方法。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
boolean |
|
获取上面所创建文件的信息:
//1.获取文件绝对路径
System.out.println("1、"+file.getAbsolutePath());
//2.获取文件相对路径
System.out.println("2、"+file.getPath());
//3.获取文件大小
System.out.println("3、"+file.length());
//4.获取文件名
System.out.println("4、"+file.getName());
//5.获取文件字符串形式
System.out.println("5、"+file.toString());
打印获取到的文件信息:
1、D:\java-2018-12\JavaSE\src\com\java\day08\file.xml
2、src\com\java\day08\file.xml
3、0
4、file.xml
5、src\com\java\day08\file.xml
(3)目录层次结构
String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
boolean | mkdir() 创建此抽象路径名指定的目录。 |
boolean | mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
使用绝对路径在 D 盘中创建一个多层目录:此处应该用 mkdirs() 而不用 mkdir() ,mkdir() 只能在已存在的目录中创建文件夹。
String pathName = "D:\\bigDir\\middleDir\\smallDir";
File directory = new File(pathName);
directory.mkdirs();//创建多层文件夹
注意:在删除文件夹时,若文件夹内有内容,必须先删除文件夹中的内容,再删除文件夹。
下面对当前项目的 com.java 文件夹进行遍历打印文件名:
String pathName = "src\\com\\java";
File directory = new File(pathName);
//获取目录中的文件/文件夹名
String[] strings = directory.list();
for (String s:strings){
System.out.println(s);
}
执行结果:
day01
day02
day03
day04
day05
day06
day07
day08
数据结构
(4)文件权限与状态
boolean | setExecutable(boolean executable) 设置此抽象路径名所有者执行权限的一个便捷方法。 |
boolean | canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean | setReadable(boolean readable) 设置此抽象路径名所有者读权限的一个便捷方法。 |
boolean | canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean | setReadOnly() 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 |
boolean | setWritable(boolean writable) 设置此抽象路径名所有者写权限的一个便捷方法。 |
boolean | canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
下面设置并打印 day08 中的 file.xml 文件的权限与状态:
//1.将文件设置为可直接执行(运行)
//如.exe文件就是可执行文件
file.setExecutable(true);
//2.设置文件为可读
file.setReadable(true);
//3.设置文件为不可写
file.setWritable(false);
此时打开此文件的属性面板:可以看到文件只能被读取和执行,不能够被写入。
4.递归遍历文件夹
首先定义一个遍历文件目录的方法:
private static void getList(File file, int i) {
//判断文件是否存在
if (!file.exists()) return;
//打印文件/文件夹名
//根据层次打印空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
System.out.print(file.getName() + "\n");
//判断是否为文件,若为目录递归调用
if (file.isFile()) return;
//获取文件夹内容
File[] directoryFile = file.listFiles();
//递归打印
//每个层次缩进两个空格
for (File temp : directoryFile) {
getList(temp, i + 2);
}
}
调用这个方法打印此文件夹内容:D:\小橘子\500套 新简历模板
String pathName = "D:\\小橘子\\500套 新简历模板";
File file = new File(pathName);
getList(file,0);