Java里面的File
-
File对象表示路径
-
这个路径可以是存在的,也可以是不存在的
在Java中,File
是一个类,它位于java.io
包中,用于文件和文件目录路径名的抽象表示形式。File
类本身并不涉及文件的读取和写入,它主要用于操作文件或目录的路径名,例如创建、删除、检查文件或目录是否存在等。
用途
- 文件或目录的创建:使用
createNewFile()
方法创建文件,使用mkdirs()
方法创建目录。 - 检查文件或目录是否存在:使用
exists()
方法。 - 获取文件或目录的属性:如名称、大小、最后修改时间等。
- 删除文件或目录:使用
delete()
方法。 - 列出目录中的文件:使用
listFiles()
方法。
如何使用
下面是一个简单的例子,演示了如何使用File
类来创建文件、检查文件是否存在以及删除文件:
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
// 创建一个File对象,表示一个文件路径
File file = new File("test.txt");
// 检查文件是否存在
if (!file.exists()) {
// 如果文件不存在,则创建它
try {
file.createNewFile();
System.out.println("文件已创建!");
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("文件已存在!");
}
// 删除文件
if (file.delete()) {
System.out.println("文件已删除!");
} else {
System.out.println("文件删除失败!");
}
}
}
注意事项
- 文件路径:在使用
File
类时,需要注意文件路径的正确性。如果路径不正确或文件不存在,可能会导致操作失败。 - 异常处理:当进行文件操作时,如创建文件或删除文件,可能会抛出
IOException
。因此,需要进行异常处理,确保程序的健壮性。 - 文件权限:在某些操作系统中,文件的创建、删除和读写等操作可能受到文件权限的限制。因此,需要确保程序有足够的权限来执行这些操作。
- 线程安全:
File
类的实例不是线程安全的。如果在多线程环境中使用同一个File
实例进行文件操作,可能会导致不可预期的结果。 - 资源释放:虽然
File
类本身不涉及文件的读取和写入,但如果你在使用FileInputStream
、FileOutputStream
、FileReader
、FileWriter
等类进行文件操作时,需要注意及时关闭这些资源,以避免资源泄漏。
遍历并获取
package com.mohuanan.file;
import java.io.File;
public class Demo03 {
public static void main(String[] args) {
//创建File对象
File f1 = new File("D:\\testfile");
//遍历f1
File[] files = f1.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
System.out.println(files.length);
}
}
常见的方法
在Java中,File
类提供了许多常见的方法来操作文件和目录。以下是一些常见的File
类方法:
- 构造方法:
File(String pathname)
: 根据给定的路径名字符串创建一个新的File
实例。File(String parent, String child)
: 根据父路径名字符串和子路径名字符串创建一个新的File
实例。File(File parent, String child)
: 根据父File
实例和子路径名字符串创建一个新的File
实例。
- 判断文件或目录是否存在:
boolean exists()
: 检查此抽象路径名表示的文件或目录是否存在。
- 判断是否为文件或目录:
boolean isFile()
: 测试此抽象路径名是否表示一个已存在的普通文件。boolean isDirectory()
: 测试此抽象路径名是否表示一个目录(也可能是空的)。
- 获取文件或目录的信息:
String getName()
: 返回由此抽象路径名表示的文件或目录的名称。String getAbsolutePath()
: 返回此抽象路径名的绝对路径名字符串。File getParentFile()
: 返回此抽象路径名父目录的抽象路径名。如果此路径名没有指定父目录,则返回null
。
- 文件或目录的创建:
boolean createNewFile()
: 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。boolean mkdir()
: 创建一个新的目录。boolean mkdirs()
: 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。
- 文件或目录的删除:
boolean delete()
: 删除此抽象路径名表示的文件或目录。void deleteOnExit()
: 请求在虚拟机终止时删除此抽象路径名表示的文件或目录。
- 重命名文件或目录:
boolean renameTo(File dest)
: 将此抽象路径名重命名为给定的目标抽象路径名。
- 检查是否为隐藏文件或目录:
boolean isHidden()
: 测试此抽象路径名指定的文件是否是一个隐藏的文件。
- 检查是否为绝对路径:
boolean isAbsolute()
: 测试此抽象路径名是否为绝对路径名。
这只是File
类提供的一些常见方法,实际上还有其他一些方法,但上述方法通常是在日常编程中最常用的。需要注意的是,File
类主要用于文件和目录的路径名管理,而不涉及文件内容的读写操作。如果要读写文件内容,需要使用其他类,如FileReader
、FileWriter
、BufferedReader
、BufferedWriter
等。
综合案例
遍历电脑的所有文件
package com.mohuanan.fileexercise;
import java.io.File;
public class Demo03 {
public static void main(String[] args) {
findAllPan();
}
//找到所有的盘符
public static void findAllPan(){
//使用静态方法
File[] files = File.listRoots();
//遍历数组
for (int i = 0; i < files.length; i++) {
//调用findAvi方法
findAvi(files[i]);
}
}
//找盘符下的所有文件
public static void findAvi(File file) {
//1. 进入文件
File[] files = file.listFiles();
//4. 判断 因为有的文件是有权限限制的 当文件有权限限制的时候 就返回null
if (files != null) {
//2. 遍历数组
for (File f : files) {
//3. 判断
if (f.isFile()) {
String name = f.getName();
if (name.endsWith(".md")) {
System.out.println(f);
}
} else {
findAvi(f);
}
}
}
}
}
删除指定路径所有的文件和文件夹
package com.mohuanan.fileexercise;
import java.io.File;
public class Demo04 {
public static void main(String[] args) {
//创建File对象
File f = new File("D:\\aaa");
//记得要去调用方法
deleteFiles(f);
}
/*
* 作用:删除指定路径所有的文件和文件夹
* */
public static void deleteFiles(File file) {
//1. 进入文件
File[] files = file.listFiles();
//因为有些是有权限的
if (files != null) {
//2. 遍历数组
for (File f : files) {
//3. 判断
if (f.isFile()) {
f.delete();
} else if (f.isDirectory()) {
//递归
deleteFiles(f);
}
}
//删除自己
file.delete();
}
}
}
统计文件的大小
package com.mohuanan.fileexercise;
import java.io.File;
public class Demo05 {
public static void main(String[] args) {
//创建File对象
File f = new File("D:\\marktext的文档");
long big = getBig(f);
System.out.println("文件的大小为: "+ big/1024/1024);
}
/*
* 参数一 :表示文件的路径
* 返回值: 该文件夹里面所有的文件的大小
* 作用: 统计该路径下的所有文件的大小 (字节数)
*
* */
public static long getBig(File file){
//统计文件的大小
long len = 0;
//1. 进入文件
File[] files = file.listFiles();
//2. 遍历数组
for (File f : files) {
//3. 判断
if(f.isFile()){
//如果是文件
//累加
len = len + f.length();
}else{
//递归
//累加
len = len + getBig(f);
}
}
return len;
}
}
统计文件的个数
package com.mohuanan.fileexercise;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Demo06 {
public static void main(String[] args) {
//创建File对象
File f = new File("D:\\marktext的文档");
HashMap<String, Integer> count = getCount(f);
Set<Map.Entry<String, Integer>> entries = count.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
System.out.println(entry);
}
}
/*
* 参数表示: 文件的路径
* 返回值: 该子文件的文件的个数
* 作用: 统计文件夹的所有的文件的个数,包括子文件夹
* */
public static HashMap<String, Integer> getCount(File file) {
HashMap<String, Integer> hm = new HashMap<>();
//1. 进入文件
File[] files = file.listFiles();
//2. 遍历数组
for (File f : files) {
//3. 判断是否是文件
if (f.isFile()) {
String[] split = f.getName().split("\\.");
//获取文件后缀
String name = split[split.length - 1];
//是否已经在集合里面
if (hm.containsKey(name)) {
//在集合里面 次数累加
int count = hm.get(name);
count++;
hm.put(name, count);
} else {
//不在集合里面
hm.put(name, 1);
}
} else {
//是文件夹 递归
HashMap<String, Integer> tempHm = getCount(f);
//将返回值tempHm 累加到hm里
//遍历tempHm集合
Set<Map.Entry<String, Integer>> entries = tempHm.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
int value = entry.getValue();
if (hm.containsKey(key)) {
//和hm集合里面的键重复 累加
int t = hm.get(key);
int total = value + t;
hm.put(key, total);
} else {
//首次
hm.put(key, value);
}
}
}
}
return hm;
}
}