File 类是 Java 中用于处理文件和目录的基本类之一,位于 java.io 包中。它提供了多种方法来创建、删除、检查、修改文件或目录的属性,以及列出文件夹中的内容。虽然 File 类本身不提供直接的读取或写入文件内容的方法(这些操作通常由 FileInputStream, FileOutputStream, BufferedReader, BufferedWriter 等类来完成),但它为文件和目录的操作提供了强大的功能。
File 类的主要构造方法有:
File file = new File("example.txt");
File file = new File("C:/Documents", "example.txt");
File parentDir = new File("C:/Documents");
File file = new File(parentDir, "example.txt");
如果文件不存在,则创建该文件,若文件已经存在,则不会覆盖它。返回 true 表示文件创建成功,返回 false 表示文件已经存在。
File file = new File("example.txt");
if (file.createNewFile()) {
System.out.println("文件创建成功");
} else {
System.out.println("文件已存在");
}
创建单一目录。如果目录已经存在,则返回 false,如果创建成功则返回 true。
File dir = new File("newDirectory");
if (dir.mkdir()) {
System.out.println("目录创建成功");
} else {
System.out.println("目录已存在或创建失败");
}
创建多层目录,如果父目录不存在,也会一并创建。返回 true 表示成功,false 表示失败。
File dir = new File("parentDir/childDir");
if (dir.mkdirs()) {
System.out.println("多层目录创建成功");
} else {
System.out.println("创建失败");
}
删除文件或目录。如果文件/目录存在并且可以删除,则返回 true,否则返回 false。需要注意,删除操作是不可恢复的。
File file = new File("example.txt");
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败");
}
检查文件或目录是否存在。
if (file.exists()) {
System.out.println("文件或目录存在");
} else {
System.out.println("文件或目录不存在");
}
检查 File 对象是否表示目录。如果是目录返回 true,否则返回 false。
if (file.isDirectory()) {
System.out.println("这是一个目录");
}
检查 File 对象是否表示文件。如果是文件返回 true,否则返回 false。
if (file.isFile()) {
System.out.println("这是一个文件");
}
String name = file.getName();
System.out.println("文件名: " + name);
String path = file.getPath();
System.out.println("路径: " + path);
long size = file.length();
System.out.println("文件大小: " + size + " 字节");
boolean renameTo(File dest): 将当前文件重命名或移动到目标路径。如果成功返回 true,否则返回 false。
File newFile = new File("newExample.txt");
if (file.renameTo(newFile)) {
System.out.println("文件重命名成功");
} else {
System.out.println("文件重命名失败");
}
if (file.canRead()) {
System.out.println("文件可读");
}
if (file.canWrite()) {
System.out.println("文件可写");
}
if (file.canExecute()) {
System.out.println("文件可执行");
}
File dir = new File("C:/Documents");
String[] files = dir.list();
if (files != null) {
for (String filename : files) {
System.out.println(filename);
}
}
File dir = new File("C:/Documents");
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
System.out.println(f.getName());
}
}
String path = "folder" + File.separator + "example.txt";
场景
我们希望创建一个程序来处理用户上传的文件。程序会:
import java.io.*;
public class FileExample {
public static void main(String[] args) {
// 文件路径
File file = new File("example.txt");
// 1. 检查文件是否存在
if (file.exists()) {
System.out.println("文件已存在");
} else {
try {
// 2. 如果文件不存在,创建一个新的文件
if (file.createNewFile()) {
System.out.println("文件创建成功");
} else {
System.out.println("文件创建失败");
}
} catch (IOException e) {
System.out.println("发生错误: " + e.getMessage());
}
}
// 3. 向文件写入内容
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("Hello, this is a test file.");
writer.newLine();
writer.write("This file was created and written by the FileExample program.");
System.out.println("写入文件成功");
} catch (IOException e) {
System.out.println("写入文件时发生错误: " + e.getMessage());
}
// 4. 读取文件内容
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
System.out.println("读取文件内容:");
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("读取文件时发生错误: " + e.getMessage());
}
// 5. 删除文件
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败");
}
}
}
在当前模块下的aaa文件夹中创建一个a.txt文件
代码实现:
public class Test1 {
public static void main(String[] args) throws IOException {
//需求:在当前模块下的aaa文件夹中创建一个a.txt文件
//1.创建a.txt的父级路径
File file = new File("myfile\\aaa");
//2.创建父级路径
//如果aaa是存在的,那么此时创建失败的。
//如果aaa是不存在的,那么此时创建成功的。
file.mkdirs();
//3.拼接父级路径和子级路径
File src = new File(file,"a.txt");
boolean b = src.createNewFile();
if(b){
System.out.println("创建成功");
}else{
System.out.println("创建失败");
}
}
}
定义一个方法找某一个文件夹中,是否有以avi结尾的电影(暂时不需要考虑子文件夹)
代码示例:
public class Test2 {
public static void main(String[] args) {
/*需求:
定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
(暂时不需要考虑子文件夹)
*/
File file = new File("D:\\aaa\\bbb");
boolean b = haveAVI(file);
System.out.println(b);
}
/*
* 作用:用来找某一个文件夹中,是否有以avi结尾的电影
* 形参:要查找的文件夹
* 返回值:查找的结果 存在true 不存在false
* */
public static boolean haveAVI(File file){// D:\\aaa
//1.进入aaa文件夹,而且要获取里面所有的内容
File[] files = file.listFiles();
//2.遍历数组获取里面的每一个元素
for (File f : files) {
//f:依次表示aaa文件夹里面每一个文件或者文件夹的路径
if(f.isFile() && f.getName().endsWith(".avi")){
return true;
}
}
//3.如果循环结束之后还没有找到,直接返回false
return false;
}
}
找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
代码示例:
public class Test3 {
public static void main(String[] args) {
/* 需求:
找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
套路:
1,进入文件夹
2,遍历数组
3,判断
4,判断
*/
findAVI();
}
public static void findAVI(){
//获取本地所有的盘符
File[] arr = File.listRoots();
for (File f : arr) {
findAVI(f);
}
}
public static void findAVI(File src){//"C:\\
//1.进入文件夹src
File[] files = src.listFiles();
//2.遍历数组,依次得到src里面每一个文件或者文件夹
if(files != null){
for (File file : files) {
if(file.isFile()){
//3,判断,如果是文件,就可以执行题目的业务逻辑
String name = file.getName();
if(name.endsWith(".avi")){
System.out.println(file);
}
}else{
//4,判断,如果是文件夹,就可以递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
findAVI(file);
}
}
}
}
}
需求: 如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
代码示例:
public class Test4 {
public static void main(String[] args) {
/*
删除一个多级文件夹
如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
*/
File file = new File("D:\\aaa\\src");
delete(file);
}
/*
* 作用:删除src文件夹
* 参数:要删除的文件夹
* */
public static void delete(File src){
//1.先删除文件夹里面所有的内容
//进入src
File[] files = src.listFiles();
//遍历
for (File file : files) {
//判断,如果是文件,删除
if(file.isFile()){
file.delete();
}else {
//判断,如果是文件夹,就递归
delete(file);
}
}
//2.再删除自己
src.delete();
}
}
需求:统计一个文件夹的总大小
代码示例:
public class Test5 {
public static void main(String[] args) {
/*需求:
统计一个文件夹的总大小
*/
File file = new File("D:\\aaa\\src");
long len = getLen(file);
System.out.println(len);//4919189
}
/*
* 作用:
* 统计一个文件夹的总大小
* 参数:
* 表示要统计的那个文件夹
* 返回值:
* 统计之后的结果
*
* 文件夹的总大小:
* 说白了,文件夹里面所有文件的大小
* */
public static long getLen(File src){
//1.定义变量进行累加
long len = 0;
//2.进入src文件夹
File[] files = src.listFiles();
//3.遍历数组
for (File file : files) {
//4.判断
if(file.isFile()){
//我们就把当前文件的大小累加到len当中
len = len + file.length();
}else{
//判断,如果是文件夹就递归
len = len + getLen(file);
}
}
return len;
}
}
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
代码示例:
public class Test6 {
public static void main(String[] args) throws IOException {
/*
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
*/
File file = new File("D:\\aaa\\src");
HashMap<String, Integer> hm = getCount(file);
System.out.println(hm);
}
/*
* 作用:
* 统计一个文件夹中每种文件的个数
* 参数:
* 要统计的那个文件夹
* 返回值:
* 用来统计map集合
* 键:后缀名 值:次数
*
* a.txt
* a.a.txt
* aaa(不需要统计的)
*
*
* */
public static HashMap<String,Integer> getCount(File src){
//1.定义集合用来统计
HashMap<String,Integer> hm = new HashMap<>();
//2.进入src文件夹
File[] files = src.listFiles();
//3.遍历数组
for (File file : files) {
//4.判断,如果是文件,统计
if(file.isFile()){
//a.txt
String name = file.getName();
String[] arr = name.split("\\.");
if(arr.length >= 2){
String endName = arr[arr.length - 1];
if(hm.containsKey(endName)){
//存在
int count = hm.get(endName);
count++;
hm.put(endName,count);
}else{
//不存在
hm.put(endName,1);
}
}
}else{
//5.判断,如果是文件夹,递归
//sonMap里面是子文件中每一种文件的个数
HashMap<String, Integer> sonMap = getCount(file);
//hm: txt=1 jpg=2 doc=3
//sonMap: txt=3 jpg=1
//遍历sonMap把里面的值累加到hm当中
Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
int value = entry.getValue();
if(hm.containsKey(key)){
//存在
int count = hm.get(key);
count = count + value;
hm.put(key,count);
}else{
//不存在
hm.put(key,value);
}
}
}
}
return hm;
}
}