目录
是什么
是一种对于文件和目录路径名的抽象表示。在Java中与文件系统进行交互的基础类,它提供了许多方便的方法来操作文件和目录。
位于包
位于 java.io 包中,需要手动导入。
作用
用于创建、删除、检查和修改文件和目录的方法。File类不直接处理文件的内容,而是提供了与文件或目录的底层属性进行交互的方法。
PS:File类只能对文件本身进行操作,不能读写文件里面存储的数据。
特点
File类特点如下:
-
抽象表示:File类提供了对文件和目录路径名的抽象表示,允许开发者通过对象化的方式处理文件系统的实体。
-
跨平台性:File类使用抽象路径名,这意味着它可以在不同的操作系统上运行,而无需担心底层文件系统的差异。通过File.separator属性,File类可以自动处理不同操作系统的路径分隔符。
-
路径操作:File类提供了一系列的方法来构建和操作路径。例如,getParent()方法可以获取文件的父目录,getName()方法返回文件或目录的名称,getAbsolutePath()返回文件的绝对路径等。
-
元数据访问:File类可以查询文件和目录的元数据,如文件的大小(length())、最后修改时间(lastModified())、是否是隐藏文件(isHidden())等。
-
文件和目录管理:File类提供了创建新文件或目录(createNewFile(), mkdir(), mkdirs())、删除文件或目录(delete())、重命名文件或目录(renameTo())等方法,方便进行文件和目录的管理。
-
文件筛选:File类可以与FilenameFilter和FileFilter接口结合使用,允许开发者根据自定义的条件来筛选文件和目录。
-
只读操作:虽然File类可以执行文件和目录的创建、删除等操作,但它本身并不涉及文件内容的读写。对于文件内容的操作,需要使用InputStream、OutputStream、Reader、Writer等类。
-
安全性:File类在执行一些操作时(如删除文件或目录)可能会抛出SecurityException,以确保应用程序不会执行未经授权的文件系统操作。
-
非阻塞:File类的方法通常都是非阻塞的,即它们会立即返回,而不会等待底层文件系统操作完成。如果需要等待操作完成,开发者需要自行实现同步机制。
常用方法表格形式
方法名称 | 方法作用 |
---|---|
exists() | 检查文件或目录是否存在 |
isFile() | 检查是否为文件 |
isDirectory() | 检查是否为目录 |
isHidden() | 检查文件或目录是否隐藏 |
length() | 返回文件的大小(以字节为单位) |
lastModified() | 返回文件或目录最后修改的时间 |
canRead() | 检查应用程序是否可以读取文件或目录 |
canWrite() | 检查应用程序是否可以写入文件或目录 |
getName() | 返回文件或目录的名称 |
getPath() | 返回文件或目录的路径名 |
getAbsolutePath() | 返回文件或目录的绝对路径名 |
getParent() | 返回文件或目录的父目录的路径名 |
getParentFile() | 返回文件或目录的父目录的抽象路径名 |
list() | 返回一个字符串数组,表示目录中的文件和目录名 |
listFiles() | 返回一个抽象路径名数组,表示目录中的文件和目录 |
listFiles(FilenameFilter filter) | 使用过滤器返回目录中的文件和目录 |
createNewFile() | 当且仅当不存在具有此抽象路径名的文件时,创建一个新的空文件 |
delete() | 删除文件或目录 |
mkdir() | 创建单级目录 |
mkdirs() | 创建多级目录 |
renameTo(File dest) | 重命名文件或目录 |
setReadOnly() | 设置文件为只读 |
setWritable(boolean writable, boolean ownerOnly) | 设置文件的可写性 |
setReadable(boolean readable, boolean ownerOnly) | 设置文件的可读性 |
setExecutable(boolean executable, boolean ownerOnly) | 设置文件的可执行性 |
常用方法分类并示例
按照对文件或目录的不同操作进行分类。
文件和目录的创建
createNewFile()
创建一个新的空文件。
示例:
// 指定文件路径和名称
String filePath = "C:\\myfile.txt"; // 注意这里的路径使用双反斜杠,因为反斜杠在Java字符串中是转义字符
File file = new File(filePath);
if (file.createNewFile()) {
System.out.println("File created: " + file.getName());
} else {
System.out.println("File already exists.");
}
mkdir()
创建单个目录。
示例:
File directory = new File("C:\\your\\directory");
boolean result = directory.mkdir();
if (result) {
System.out.println("Directory created: " + directory.getName());
} else {
System.out.println("Directory creation failed.");
}
mkdirs()
创建目录及其所有父目录 。
示例:
File nestedDirectory = new File("C:\\your\\nested\\directory");
boolean nestedResult = nestedDirectory.mkdirs();
if (nestedResult) {
System.out.println("Nested directory created: " + nestedDirectory.getName());
} else {
System.out.println("Nested directory creation failed.");
}
PS:创建文件或目录创建成功返回true,否则返回false(如果因为文件或目录已存在也会返回false)。如果文件或目录因为权限问题创建失败会报IO异常,需要我们捕获异常并处理。
文件和目录的检查
File类提供了一系列的方法来检查文件或目录的存在性、可读性、可写性、是否为文件或目录等。
exists()
检查文件或目录是否存在。
示例:
File file = new File("C:\\to\\file_or_directory");
if (file.exists()) {
System.out.println("文件或目录存在。");
} else {
System.out.println("文件或目录不存在。");
}
isFile()
检查是否为文件。
示例:
File fileOrDirectory = new File("C:\\to\\file.txt");
if (fileOrDirectory.isFile()) {
System.out.println("是一个文件。");
} else {
System.out.println("不是一个文件,可能是一个目录。");
}
isDirectory()
检查是否为目录。
示例:
File fileOrDirectory = new File("C:\\to");
if (fileOrDirectory.isDirectory()) {
System.out.println("是一个目录。");
} else {
System.out.println("不是一个目录,可能是一个文件。");
}
canRead()
检查文件是否可读。
示例:
File fileOrDirectory = new File("C:\\to\\file_or_directory");
if (fileOrDirectory.canRead()) {
System.out.println("文件或目录可读。");
} else {
System.out.println("文件或目录不可读。");
}
canWrite()
检查文件或目录是否可写。
示例:
File fileOrDirectory = new File("C:\\to\\file_or_directory");
if (fileOrDirectory.canWrite()) {
System.out.println("文件或目录可写。");
} else {
System.out.println("文件或目录不可写。");
}
isHidden()
检查文件是否隐藏。(注意,这个方法在某些操作系统上可能无法准确工作)。
示例:
File file = new File("C:\\to\\file.txt");
if (file.isHidden()) {
System.out.println("文件是隐藏的。");
} else {
System.out.println("文件不是隐藏的。");
}
length()
获取文件大小(只适用于文件,以字节为单位)。
示例:
File file = new File("C:\\to\\file.txt");
if (file.isFile()) {
long size = file.length();
System.out.println("文件大小为:" + size + " 字节。");
} else {
System.out.println("不是一个文件,无法获取大小。");
}
lastModified()
获取文件或目录最后修改时间。
示例:
File fileOrDirectory = new File("C:\\to\\file_or_directory");
long lastModifiedTime = fileOrDirectory.lastModified();
System.out.println("最后修改时间为:" + new Date(lastModifiedTime));
PS:返回目录最后修改的时间,这个时间戳通常是在目录中的文件或子目录被创建、删除或修改时更新的。
但需要注意,不是所有的文件系统或操作系统都会严格遵循这一行为。有些文件系统可能仅在目录结构本身(即目录中的条目被添加、删除或重命名)发生变化时才更新目录的修改时间,而不是当目录下的文件内容发生变化时。
如果你想要检查目录下内容的修改时间,你可能需要遍历目录中的所有文件和子目录,并检查它们各自的 lastModified() 时间
文件和目录的删除
delete()
删除文件或空目录。注意,这个方法不能删除非空目录。
示例:
// 指定要删除的文件路径
String filePath = "C:\\to\\file_or_directory";
// 创建一个File对象
File file = new File(filePath);
// 删除文件或目录
boolean isDeleted = file.delete();
// 输出删除结果
if (isDeleted) {
System.out.println("文件或目录已被成功删除");
} else {
System.out.println("删除文件或目录失败");
}
文件和目录的获取
getName()
获取文件或目录的名称。
示例:
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\test\\file_or_directory");
String fileName = file.getName();
System.out.println("文件名: " + fileName);
getParentFile()
获取文件或目录的父目录。
示例:
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\test\\file_or_directory");
File parentDirectory = fileOrDirectory.getParentFile();
//返回值为文件或目录的父目录地址,如果文件或目录是根目录下的项,那么将返回null
getPath()
获取文件或目录的路径名。
示例:
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\test\\file_or_directory");
String filePath = file.getPath();
System.out.println("路径: " + filePath);
getAbsolutePath()
获取文件或目录的绝对路径名。
示例:
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\test\\file_or_directory");
String fileAbsolutePath = file.getAbsolutePath();
System.out.println("绝对路径: " + fileAbsolutePath);
文件和目录的遍历
可以使用listFiles()
方法获取目录中的文件和子目录列表,然后遍历这些文件和子目录。
list()
获取目录中的文件和子目录列表,返回一个字符串数组,该数组包含目录中所有文件和子目录的名称(不包括路径)。
示例:
File dir = new File("C:\\to\\directory");
String[] files = dir.list();
if (files != null) {
for (String file : files) {
System.out.println(file);
}
}
listFiles()
获取目录中的文件和子目录列表,返回一个File对象数组,该数组包含目录中所有文件和子目录的File对象(包括路径信息)
示例:
File dir = new File("C:\\to\\directory");
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
PS:选择使用哪个方法取决于你的具体需求。如果你只需要文件名,并且对性能有严格要求,那么list()可能是更好的选择。如果你需要访问文件的路径或其他属性,那么listFiles()会更方便。
相关疑问
list()方法和listFiles()方法的区别
list方法和listFiles方法的区别如下:
返回值方面:list()返回String数组,包含文件名;而listFiles()返回File对象数组,包含完整的文件和目录对象。
过滤方面:两者都有重载版本允许过滤,但使用的过滤接口不同(FilenameFilter vs FileFilter)。
处理空目录方面:如果遍历目录为空,list()会返回长度为0的数组,而listFiles()会返回null。
性能方面:在处理大量文件时,listFiles()可能会比list()稍慢一些,因为它需要创建更多的File对象。但在大多数情况下,这种性能差异可以忽略不计。
文件过滤
在列出目录内容时,File类与FilenameFilter和FileFilter接口结合使用,可以方便地过滤出符合特定条件的文件。
FilenameFilter
list方法有一个重载版本,它接受一个FilenameFilter参数,允许你基于文件名进行过滤。
File dir = new File("C:\\to\\directory");
// 第一种写法(匿名内部类,用于创建并实现某个接口的临时实例)
String[] fileNames = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
if (fileNames != null) {
for (String fileName : fileNames) {
System.out.println(fileName);
}
}
// 第二种写法
// 创建一个FilenameFilter,只接受以.txt结尾的文件名
FilenameFilter filenameFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt"); // 只接受以.txt结尾的文件
}
};
// 使用FilenameFilter列出所有以.txt结尾的文件
String[] fileNames = dir.list(filenameFilter);
if (fileNames != null) {
for (String fileName : fileNames) {
System.out.println(fileName);
}
}
//第三种写法(使用FilenameFilter的lambda表达式)
// 使用lambda表达式创建FilenameFilter
FilenameFilter filenameFilter = (dir, name) -> name.endsWith(".txt");
// 使用FilenameFilter列出所有以.txt结尾的文件
String[] fileNames = dir.list(filenameFilter);
if (fileNames != null) {
for (String fileName : fileNames) {
System.out.println(fileName);
}
}
FileFilter
listFiles方法有一个重载版本,它接受一个FileFilter参数,允许你基于File对象的属性进行过滤。
File dir = new File("C:\\to\\directory");
// 第一种写法(匿名内部类,用于创建并实现某个接口的临时实例)
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.getName().endsWith(".txt");
}
});
if (files != null) {
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
// 第二种写法
// 创建一个FileFilter,只接受文件(不接受目录)
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return !file.isDirectory(); // 只接受文件
}
};
// 使用FileFilter列出所有文件
File[] files = dir.listFiles(fileFilter);
if (files != null) {
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
// 第三种写法(使用FileFilter的lambda表达式)
// 使用lambda表达式创建FileFilter
FileFilter fileFilter = file -> !file.isDirectory();
// 使用FileFilter列出所有文件
File[] files = dir.listFiles(fileFilter);
if (files != null) {
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
标准格式File操作
创建文件
public static void main(String[] args) {
String filePath = "c:\\your\\file.txt";
File file = new File(filePath);
if (file.exists()) {
System.out.println("文件已存在,无法创建新文件。");
} else {
try {
if (file.createNewFile()) {
System.out.println("文件创建成功!");
} else {
// 在正常情况下,如果文件不存在,createNewFile()应该返回true
// 如果返回false,可能是因为有并发操作或者文件系统问题
System.out.println("文件创建失败,尽管文件之前不存在。");
}
} catch (IOException e) {
// 处理创建文件时可能出现的其他IO异常
e.printStackTrace();
System.out.println("文件创建过程中发生IO异常。");
}
}
}
创建目录
public static void main(String[] args) {
String directoryPath = "C:\\to\\your\\directory";
File directory = new File(directoryPath);
if (directory.exists()) {
if (directory.isDirectory()) {
System.out.println("目录已存在,无需创建。");
} else {
System.out.println("路径存在,但不是目录,无法创建目录。");
}
} else {
try {
boolean success = directory.mkdirs();
if (success) {
System.out.println("目录创建成功!");
} else {
// 如果目录创建失败(虽然这通常是因为父目录不存在),则输出错误消息
System.out.println("目录创建失败,尽管它之前不存在。");
}
} catch (IOException e) {
// 处理创建目录时可能出现的其他IO异常
e.printStackTrace();
System.out.println("目录创建过程中发生IO异常。");
}
}
}
删除文件
public static void main(String[] args) {
// 指定要删除的文件路径
String filePath = "C:\\to\\your\\file.txt";
// 创建一个File对象
File file = new File(filePath);
// 检查文件是否存在
if (file.exists()) {
try {
// 删除文件
boolean isDeleted = file.delete();
// 输出删除结果
if (isDeleted) {
System.out.println("文件已被成功删除");
} else {
System.out.println("删除文件失败");
}
catch (IOException e) {
// 处理删除文件时可能出现的其他IO异常
e.printStackTrace();
System.out.println("文件删除过程中发生IO异常。文件名称为:" + dir.getName() + "文件的地址为:" + dir.getPath());
}
} else {
System.out.println("文件不存在");
}
}
删除目录(并遍历删除目录下的子目录和文件)
File本身并不直接提供删除整个目录(包括其内容)的方法。但是,你可以通过递归地遍历目录并删除每个文件和子目录来实现这个功能。
public static void main(String[] args) {
// 指定要删除的目录路径
String directoryPath = "/path/to/your/directory";
// 创建一个File对象,表示目录
File directory = new File(directoryPath);
// 检查目录是否存在
if (directory.exists()) {
// 如果是目录,则删除目录及其内容
if (directory.isDirectory()) {
deleteDirectory(directory);
System.out.println("目录已被成功删除");
} else {
System.out.println("路径不是一个目录");
}
} else {
System.out.println("目录不存在");
}
}
/**
* 递归删除目录及其内容
*
* @param dir 要删除的目录
* @return 如果删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (String child : children) {
boolean success = deleteDirectory(new File(dir, child));
if (!success) {
return false;
}
}
}
try {
// 目录现在是空的或者不是一个目录,所以删除它
return dir.delete();
} catch (IOException e) {
// 处理删除文件或目录时可能出现的其他IO异常
e.printStackTrace();
System.out.println("文件或目录删除过程中发生IO异常。文件或目录名称为:" + dir.getName() + "文件或目录的地址为:" + dir.getPath());
return false;
}
}
PS:deleteDirectory()说明,它会遍历目录中的所有文件和子目录,并逐个删除它们。如果目录中的任何文件或子目录不能被删除,该方法将返回 false。如果整个目录及其内容都被成功删除,它将返回 true。
获取文件或目录名称(并遍历目录下的子目录和文件)
// 方法一
public static void main(String[] args) {
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\file_or_directory");
// 判断是否是文件
if (file.isFile()) {
// 获取文件名
System.out.println("文件名: " + file.getName());
} else if (file.isDirectory()) {// 判断是否是目录
// 获取目录名
System.out.println("目录名: " + file.getName());
// 获取目录下的文件和子目录
String[] files = file.list();
if (files != null) {
System.out.println("目录下的文件和子目录:");
for (String fileOrDirName : files) {
System.out.println(fileOrDirName);
}
}
}
}
// 方法二
public static void main(String[] args) {
// 创建一个File对象,表示一个文件/目录
File file = new File("C:\\to\\file_or_directory");
// 判断是否是文件
if (file.isFile()) {
// 获取文件名
System.out.println("文件名: " + file.getName());
} else if (file.isDirectory()) {// 判断是否是目录
// 获取目录名
System.out.println("目录名: " + file.getName());
// 获取目录下的文件和子目录
File[] files = dir.listFiles();
if (files != null) {
System.out.println("目录下的文件和子目录:");
for (File file : files) {
System.out.println(file.getName());
}
}
}
}