目录
1. 概述
File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径
这个路径可以是存在的,也允许是不存在的
方法名称 | 说明 |
---|---|
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent,String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File(File parent,String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
import java.io.File;
public class FileDemo01 {
public static void main(String[] args) {
//根据文件路径创建文件对象
String str = "e:/kk/bb.txt";
File file = new File(str);
System.out.println(file); //e:\kk\bb.txt
//根据父路径名字符串和子路径名字符串创建文件对象
String fu = "e:/kk";
String zi = "bb.txt";
File file1 = new File(fu, zi);
// File file1 = new File(fu + "\\" + zi); //也是对的
System.out.println(file1);//e:\kk\bb.txt
//根据父路径对应文件对象和子路径名字符串创建文件对象
File fu2 = new File("e:/kk");
String zi2 = "bb.txt";
File file2 = new File(fu2, zi2);
System.out.println(file2);//e:\kk\bb.txt
}
}
绝对路径是带盘符的。
相对路径是不带盘符的,默认到当前项目下去找。
2. File的常见成员方法(判断、获取)
方法名称 | 说明 |
---|---|
public boolean isDirectory() | 判断此路径名表示的File是否为文件夹 |
public boolean isFile() | 判断此路径名表示的File是否为文件 |
public boolean exists() | 判断此路径名表示的File是否存在 |
public long length() | 返回文件的大小(字节数量) |
public String getAbsolutePath() | 返回文件的绝对路径 |
public String getPath() | 返回定义文件时使用的路径 |
public String getName() | 返回文件的名称,带后缀 |
public long lastModified() | 返回文件的最后修改时间(时间毫秒值) |
import javax.xml.crypto.Data;
import java.io.File;
/**
* public boolean isDirectory() 判断此路径名表示的File是否为文件夹
* public boolean isFile() 判断此路径名表示的File是否为文件
* public boolean exists() 判断此路径名表示的File是否存在
* public long length() 返回文件的大小(字节数量)
* public String getAbsolutePath() 返回文件的绝对路径
* public String getPath() 返回定义文件时使用的路径
* public String getName() 返回文件的名称,带后缀
* public long lastModified() 返回文件的最后修改时间(时间毫秒值)
*/
public class FileDemo02 {
public static void main(String[] args) {
File file = new File("e:/kk");
System.out.println("是否为文件夹:" + file.isDirectory());//true
System.out.println("是否为文件夹:" + file.isFile());//false
System.out.println("是否存在:" + file.exists());//true
file = new File("e:/kk/aa.txt");
//单位是字节,如果想要是M、G,可以除以1024
//无法获取文件夹的大小,如要要获取文件夹的大小,需要把文件夹里所有文件大小累加到一起
System.out.println("文件的大小:" + file.length());//594(字节)
System.out.println("文件的绝对路径:" + file.getAbsolutePath());//e:\kk\aa.txt
System.out.println("定义文件时使用的路径:" + file.getPath());//e:\kk\aa.txt
System.out.println("文件的名称,带后缀:" + file.getName());//aa.txt
System.out.println("文件的最后修改时间(时间毫秒值):" + file.lastModified());//1692431627089
}
}
3. File的常见成员方法(创建、删除)
方法名称 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 创建单级文件夹 |
public boolean mkdirs() | 创建多级文件夹 |
public boolean delete() | 删除文件、空文件夹 |
delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站,删了就没了
import java.io.File;
import java.io.IOException;
/**
* public boolean createNewFile() 创建一个新的空的文件
* public boolean mkdir() 创建单级文件夹
* public boolean mkdirs() 创建多级文件夹
* public boolean delete() 删除文件、空文件夹
*/
public class FileDemo03 {
public static void main(String[] args) throws IOException {
File file = new File("e:/kk/dd.txt");
System.out.println("创建一个新的空的文件:" + file.createNewFile());
//如果创建之前有该文件,创建失败,返回false,如果没有该文件,创建成功,返回true
//如果路径错误,也创建失败,系统报错: 系统找不到指定的路径。
//createNewFile创建的一定是文件,如果路径中没有后缀名,会创建一个没有后缀名的文件
file = new File("e:/bb");
System.out.println("创建一个文件夹:" + file.mkdir());
//如果创建之前有该文件夹,创建失败,返回false,如果没有该文件夹,创建成功,返回true
file = new File("e:/aaa/bbb/ccc");
System.out.println("创建多个文件夹:" + file.mkdirs());
//既可以创建单级的,也可以创建多级的
file = new File("e:/aaaa");
System.out.println("删除文件、空文件夹" + file.delete());
//delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站,删了就没了
}
}
4. File的常见成员方法(获取并遍历)
方法名称 | 说明 |
---|---|
public File[] listFiles() | 获取当前该路径下所有内容 |
import java.io.File;
import java.util.Arrays;
/**
*public File[] listFiles() 获取当前该路径下所有内容
*/
public class FileDemo04 {
public static void main(String[] args) {
File file = new File("e:/kk");
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f);
}
//下面这种也可以
System.out.println(Arrays.toString(files));
}
}
- 当调用者File表示的路径不存在时,返回null
- 当调用者File表示的路径是文件时,返回null
- 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
- 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
- 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
方法名称 | 说明 |
---|---|
public static File[] listRoots() | 列出可用的文件系统根 |
public String[] list() | 获取当前该路径下所有内容 |
public String[] list(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
public File[] listFiles() | 获取当前该路径下所有内容 |
public File[] listFiles(FileFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
public File[] listFiles(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;
/**
* public static File[] listRoots() 列出可用的文件系统根
* public String[] list() 获取当前该路径下所有内容
* public String[] list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
* public File[] listFiles() 获取当前该路径下所有内容
* public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容
* public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
*/
public class FileDemo05 {
public static void main(String[] args) {
//列出可用的文件系统根 (系统中所有盘符)
File[] files = File.listRoots();
System.out.println("获取系统中所有盘符" + Arrays.toString(files));//[C:\, D:\, E:\]
// 获取当前该路径下所有内容(仅仅获取名字)
File file = new File("e:/kk");
String[] list = file.list();
for (String a : list) {
System.out.println(a);
}
System.out.println("-------------------------");
//利用文件名过滤器获取当前该路径下所有内容
//获取e:/kk下的所有txt文件
File file2 = new File("e:/kk");
//accept方法的形参,依次表示aaa文件类里而每一个文件或者文件炎的路径
//参数一:父级路径
//参数二:子级路径
//返回值;如果返回值为true,就表示当前路径保留
// 如果返回值为false,就表示当前路径舍弃不要
String[] list2 = file2.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
System.out.println(file1);
if (file1.isFile() && name.endsWith(".txt")) {
return true;
} else {
return false;
}
}
});
System.out.println(Arrays.toString(list2));//[aa.txt, d.txt, dd.txt, df.txt]
System.out.println("-----------------------------");
// 获取当前该路径下所有内容
File file1 = new File("e:/kk");
File[] arr = file1.listFiles();
for (File a : arr) {
if (a.isFile() && a.getName().endsWith(".txt")) {
System.out.println(a);
}
}
System.out.println("--------------------------");
//利用文件名过滤器获取当前该路径下所有内容
File file3 = new File("e:/kk");
File[] arr2 = file3.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && pathname.getName().endsWith(".txt");
}
});
System.out.println(Arrays.toString(arr2));//[e:\kk\aa.txt, e:\kk\d.txt, e:\kk\dd.txt, e:\kk\df.txt]
System.out.println("----------------------------");
//利用文件名过滤器获取当前该路径下所有内容
File[] arr3 = file3.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file4 = new File(dir, name);
return file4.isFile() && name.endsWith(".txt");
}
});
System.out.println(Arrays.toString(arr3));//[e:\kk\aa.txt, e:\kk\d.txt, e:\kk\dd.txt, e:\kk\df.txt]
}
}
例如:
/**
* 在当前模块下的aaa文件夹中创建一个a.txt文件
*/
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
//创建父级路径
File file = new File("myfile/aaa");
file.mkdirs();
//拼接父级路径和自己路径
File file1 = new File(file, "a.txt");
System.out.println("创建文件是否成功:" + file1.createNewFile());
}
}
例2:
import java.io.File;
/**
* 定义一个方法找某一个文件夹中是否有以.mp4结尾的电影。
*/
public class Test2 {
public static void main(String[] args) {
File file = new File("e:/ee");
System.out.println(have(file));
}
public static boolean have(File file) {
//进入文件夹获取内容
File[] files = file.listFiles();
//遍历数组获取元素
for (File a : files) {
if (a.isFile() && a.getName().endsWith(".mp4")) {
return true;
}
}
return false;
}
}
例3:
import java.io.File;
/**
* 找到电脑中所有的MP4文件
* (考虑子文件夹)
*/
public class Test3 {
public static void main(String[] args) {
find();
}
public static void find() {
//获取所有盘符
File[] files = File.listRoots();
for (File file : files) {
find(file);
}
}
public static void find(File file) {
//进入文件夹
File[] files = file.listFiles();
if (files != null) {
//遍历数组
for (File a : files) {
//如果是文件,直接判断
if (a.isFile()) {
if (a.getName().endsWith(".mp4")) {
System.out.println(a);
}
} else {
//如果是文件夹,递归
//参数一定是file里面的文件夹
find(a);
}
}
}
}
}
例4:(这种删除,不走回收站,无法恢复数据,慎重!)
import java.io.File;
/**
* 删除一个有内容的文件夹
*/
public class Test4 {
public static void main(String[] args) {
File file = new File("e:/2023.07");
delete(file);
}
public static void delete(File file) {
//先删除里面所有的内容
//进入文件夹
File[] files = file.listFiles();
//遍历
for (File file1 : files) {
//判断,文件,直接删除
if (file1.isFile()) {
file1.delete();
} else {
//判断,文件夹
delete(file1);
}
}
//再删除自己
file.delete();
}
}
例5:
import java.io.File;
/**
* 统计一个文件夹的大小
*/
public class Test5 {
public static void main(String[] args) {
File file = new File("e:/0817");
System.out.println(getLen(file));
}
public static long getLen(File src) {
//定义变量、累加
long len = 0;
//进入文件夹
File[] files = src.listFiles();
//遍历
for (File file : files) {
//判断 文件
if (file.isFile()) {
//当前文件的大小进行累加
len = len + file.length();
} else {
//文件夹
len += getLen(file);
}
}
return len;
}
}
例6:
/**
* 统计文件夹中每种文件的个数并打印。 (考虑子文件夹)
*/
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test6 {
public static void main(String[] args) {
File file = new File("e:/0817");
HashMap<String, Integer> hm = getCount(file);
System.out.println(hm);
}
public static HashMap<String, Integer> getCount(File src) {
//定义集合类统计
//map集合 键:后缀名 值:次数
HashMap<String, Integer> hm = new HashMap<>();
File[] files = src.listFiles();
//遍历数组
for (File file : files) {
//文件 统计
if (file.isFile()) {
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 {
//文件夹
//so子文件夹中每个文件的个数
HashMap<String, Integer> so = getCount(file);
//遍历so把里面的值累加到hm中
Set<Map.Entry<String, Integer>> entries = so.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
if (hm.containsKey(key)) {
//存在
int count = hm.get(key);
count += value;
hm.put(key, value);
} else {
//不存在
hm.put(key, value);
}
}
}
}
return hm;
}
}