java.io.File
类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建,查找,删除,判断等操作。
File类常用的构造方法有以下几个:
public File(File parent, String child)
:根据 parent 抽象路径名和 child 路径名字符串创建一个新 File
实例。public File(String pathname)
:通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。public File(String parent, String child)
:根据parent路径字符串和child路径名字符串创建一个新File实例。使用举例:
import java.io.File;
public class TestFile {
public static void main(String[] args) {
// public File(File parent, String child):
// 根据 parent 抽象路径名和 child 路径名字符串创建一个新 `File` 实例。
File parent = new File("D:\\abc");
String child = "a.txt";
File f1 = new File(parent, child);
// public File(String pathname):
// 通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。
String pathname = "D:\\abc\b.txt";
File f2 = new File(pathname);
// public File(String parent, String child):
// 根据parent路径字符串和child路径名字符串创建一个新File实例。
String p = "D:\\abc";
String c = "c.txt";
File f3 = new File(p, c);
}
}
注意:
无论指定路径下的文件或者目录是否存在,都不会影响File对象的创建。
获取功能的方法
public String getAbsolutePath()
:返回File的绝对路径名字符串。public String getPath()
:将File转换为一个路径名字符串。public String getName()
:返回由此File表示的文件或目录的名称。public long length()
:返回File表示的文件的长度。import java.io.File;
public class TestFile {
public static void main(String[] args) {
File f = new File("D:\\abc\\test.txt");
System.out.println("文件绝对路径是:" + f.getAbsolutePath());
System.out.println("文件路径是:" + f.getPath());
System.out.println("文件名称是:" + f.getName());
System.out.println("文件长度是:" + f.length());
System.out.println("--------------------------------");
File f1 = new File("D:\\abc");
System.out.println("目录绝对路径是:" + f1.getAbsolutePath());
System.out.println("目录路径是:" + f1.getPath());
System.out.println("目录名称是:" + f1.getName());
System.out.println("目录长度是:" + f1.length());
}
}
输出信息:
$ java TestFile
文件绝对路径是:D:\abc\test.txt
文件路径是:D:\abc\test.txt
文件名称是:test.txt
文件长度是:425
--------------------------------
目录绝对路径是:D:\abc
目录路径是:D:\abc
目录名称是:abc
目录长度是:0
注意:
- length()是获取文件的长度,对于目录,是没有长度概念的。
- 绝对路径是指从盘符开始的,一个完整的路径。
- 相对路径是指相对于当前目录的路径。
对于路径字符串中的分隔符,不同系统有不同的表达方式,比如windows是,Linux是/,为了跨平台,可以使用
File.separator
来表示,它会根据系统使用对应的分隔符。比如:
D:\abc
, 可以使用"D:" + File.separator + "abc"
判断相关的方法
public boolean exists()
:测试File表示的文件或目录是否存在public boolean isDirectory()
:测试File表示的文件是否是一个目录public boolean isFile()
:测试File表示的文件是否是一个标准文件import java.io.File;
public class TestFile {
public static void main(String[] args) {
File f = new File("D:\\abc\\test.txt");
File f1 = new File("D:\\abc");
// 判断是否存在
System.out.println("D:\\abc\\test.txt是否存在? ==> " + f.exists());
System.out.println("D:\\abc是否存在? ==> " + f1.exists());
// 判断是否是文件
System.out.println("D:\\abc\\test.txt是文件? ==> " + f.isFile());
System.out.println("D:\\abc是文件? ==> " + f1.isFile());
// 判断是否是目录
System.out.println("D:\\abc\\test.txt是目录? ==> " + f.isDirectory());
System.out.println("D:\\abc是目录? ==> " + f1.isDirectory());
}
}
输出信息:
$ java TestFile
D:\abc\test.txt是否存在? ==> true
D:\abc是否存在? ==> true
D:\abc\test.txt是文件? ==> true
D:\abc是文件? ==> false
D:\abc\test.txt是目录? ==> false
D:\abc是目录? ==> true
新建和删除功能
public boolean createNewFile()
:当且仅当不存在File指定名称的文件时,创建一个新的空文件。public boolean delete()
:删除此File表示的文件或目录。public boolean mkdir()
:创建此File指定的目录。public boolean mkdirs()
:创建此File指定的目录,包括所有必需但不存在的父目录。import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) throws IOException{
// 创建文件
File newFile = new File("newFile.txt");
System.out.println("newFile.txt存在? ==> " + newFile.exists());
System.out.println("创建newFile.txt是否成功? ==> " + newFile.createNewFile());
System.out.println("newFile.txt存在? ==> " + newFile.exists());
System.out.println("=====================\r\n");
// 创建单级目录
File newDir = new File("newDir");
System.out.println("newDir存在? ==> " + newDir.exists());
System.out.println("创建newDir是否成功? ==> " + newDir.mkdir());
System.out.println("newDir存在? ==> " + newDir.exists());
System.out.println("=====================\r\n");
// 创建多级目录
File newDirs = new File("newDirs\\aaa");
System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
System.out.println("创建newDirs\\aaa是否成功? ==> " + newDirs.mkdirs());
System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
// 删除文件
System.out.println("删除文件: " + newFile.delete());
// 删除目录
System.out.println("删除目录: " + newDir.delete());
System.out.println("删除不为空的目录: " + newDirs.delete());
}
}
输出信息:
$ java TestFile
newFile.txt存在? ==> false
创建newFile.txt是否成功? ==> true
newFile.txt存在? ==> true
=====================
newDir存在? ==> false
创建newDir是否成功? ==> true
newDir存在? ==> true
=====================
newDirs\aaa存在? ==> true
创建newDirs\aaa是否成功? ==> false
newDirs\aaa存在? ==> true
删除文件: true
删除目录: true
删除不为空的目录: true
注意:
- 删除多级目录时候,不会整个目录级删除,只会删除最内层的非空目录。
- 目录非空时,无法被删除。
遍历目录方法
public String[] list()
:返回一个String数组,数组元素表示该File目录中所有子文件或目录名字
public File[] listFiles()
:返回一个File数组,数组元素表示该目录总所有的子文件或目录
比如当前目录下有一文件夹Dir,里面有文件a.txt,b.txt,d.txt,以及文件夹c
import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) throws IOException{
// 当前路径下的Dir目录
File f = new File("Dir");
// public String[] list()
String[] names;
names = f.list();
// 遍历files
for (String name : names) {
System.out.println(name);
}
}
}
// 输出信息
a.txt
b.txt
c
d.txt
import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) throws IOException{
// 当前路径下的Dir目录
File dir = new File("Dir");
// public File[] listFiles()
File[] files;
files = dir.listFiles();
for (File f : files) {
System.out.println(f.getName());
}
}
}
// 输出信息
a.txt
b.txt
c
d.txt
注意:
? 使用listFiles方法的File对象,其所表示的目录必须是实际存在的,否则无法遍历,报NullPointerException异常。
带过滤器的遍历目录方法
File[] listFiles(FileFilter filter)
:返回抽象路径名数组,这些路径名表示此File表示的目录中满足指定过滤器的文件和目录。说明:
? java.io.FileFilter
是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数。
? 接口中只有一个方法:boolean accept(File pathname)
:测试指定pathname是否应该包含在当前File目录中,符合就返回true。
? 通过过滤器的作用,listFiles()返回的数组元素中,子文件对象都是符合过滤条件的。
举例:查找目录Dir下,以.java结尾的文件,打印文件名字
目录如下图:
import java.io.*;
public class TestFileFilter {
public static void main(String[] args) {
File dirs = new File("Dir");
File[] files = dirs.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java");
}
});
// 打印文件名字
for (File f : files) {
System.out.println(f.getName());
}
}
}
输出:
$ java TestFileFilter
Consumer.java
Ticket.java
通过之前所学Lambda,发现上面的FileFilter接口满足只有一个接口的条件,可以使用Lambda优化,如下为优化代码:
import java.io.*;
public class TestFileFilter {
public static void main(String[] args) {
File dirs = new File("Dir");
// File[] files = dirs.listFiles(new FileFilter() {
// public boolean accept(File pathname) {
// return pathname.getName().endsWith(".java");
// }
// });
// 使用Lambda优化
File[] files = dirs.listFiles(pathname -> pathname.getName().endsWith("java"));
// 打印文件名字
for (File f : files) {
System.out.println(f.getName());
}
}
}
实现文件搜索:搜索指定目录下的.java文件
分析:
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File dir = new File("Dir");
search(dir);
}
public static void search(File dirs) {
File[] files = dirs.listFiles(p -> p.getName().endsWith(".java") || p.isDirectory());
// 循环打印
for (File f : files) {
// 如果是文件,则打印
if (f.isFile()) {
System.out.println(f.getName());
}
else { // 是目录,则递归查找
search(f);
}
}
}
}
原文:https://www.cnblogs.com/LucasBlog/p/12056676.html