Java的file
File
- File 对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
- 这个路径可以是存在的,也允许是不存在的
| 方法名称 | 说明 |
|---|---|
| public File(String pathname) | 根据文件路径创建文件对象 |
| public File(String parent, String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
| public File(File parent, String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
package com.faxont.file;
import java.io.File;
public class FileDemo1 {
public static void main(String[] args) {
/*
public File(String pathname) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象
*/
// 1. 根据字符串表示的路径,变成 File 对象
String filePath = "D:\\java\\workspace\\a.txt";
File file1 = new File(filePath);
System.out.println(file1);// D:\java\workspace\a.txt
// 2. 根据父路径和子路径,变成 File 对象
// 父级路径:D:\java\workspace
// 子级路径:a.txt
String fileParent = "D:\\java\\workspace";
String fileChild = "a.txt";
File file2 = new File(fileParent, fileChild);
System.out.println(file2);// D:\java\workspace\a.txt
// 3. 根据父路径对应的 File 对象和子路径,变成 File 对象
File fileParent2 = new File("D:\\java\\workspace");
File file3 = new File(fileParent2, fileChild);
System.out.println(file3);// D:\java\workspace\a.txt
}
}
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() | 返回文件的最后修改时间(时间毫秒值) |
package com.faxont.file;
import java.io.File;
public class FileDemo2 {
public static void main(String[] args) {
/*
public boolean isDirectory() 判断此路径名表示的 File 是否为文件夹
public boolean isFile() 判断此路径名表示的 File 是否为文件
public boolean exists() 判断此路径名表示的 File 是否存在
*/
// 1. 对一个文件夹的路径进行判断
File f1 = new File("D:\\Java\\workspace");
System.out.println(f1.isDirectory());
System.out.println(f1.isFile());
System.out.println(f1.exists());
System.out.println("-----------------------------");
// 2. 对一个文件的路径进行判断
File f2 = new File("D:\\Java\\hadoop\\test.txt");
System.out.println(f2.isDirectory());
System.out.println(f2.isFile());
System.out.println(f2.exists());
System.out.println("-----------------------------");
// 3. 对一个不存在的路径进行判断
File f3 = new File("D:\\Java\\test.txt");
System.out.println(f3.isDirectory());
System.out.println(f3.isFile());
System.out.println(f3.exists());
}
}
package com.faxont.file;
import java.io.File;
import java.text.SimpleDateFormat;
public class FileDemo3 {
public static void main(String[] args) {
/*
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)
*/
// 1. length 返回文件的大小(字节数量)
// 细节1:这个方法只能获取文件的大小,单位是字节
// 细节2:这个方法无法获取文件夹的大小
// 如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小累加在一起
File f1 = new File("D:\\java\\hadoop\\test.txt");
System.out.println(f1.length());
File f2 = new File("D:\\java\\hadoop");
System.out.println(f2.length());
System.out.println("-----------------------------");
// 2. getAbsolutePath() 返回文件的绝对路径
File f3 = new File("D:\\java\\hadoop\\test.txt");
System.out.println(f3.getAbsolutePath());
File f4 = new File("file\\a.txt");
System.out.println(f4.getAbsolutePath());
System.out.println("-----------------------------");
// 3. getPath() 返回定义文件时使用过的路径
File f5 = new File("D:\\java\\hadoop\\test.txt");
System.out.println(f5.getPath());
File f6 = new File("file\\a.txt");
System.out.println(f6.getPath());
System.out.println("-----------------------------");
// 4. getName() 获取文件的名称,带后缀
// 细节1:
// a.txt a 文件名 txt 后缀名、拓展名
// 细节2:
// 如果是文件夹,那么getName() 返回的就是文件夹的名称
File f7 = new File("D:\\java\\hadoop\\test.txt");
System.out.println(f7.getName());
File f8 = new File("D:\\java\\hadoop");
System.out.println(f8.getName());
System.out.println("-----------------------------");
// 5. lastModified() 返回文件的最后修改时间(时间毫秒值)
File f9 = new File("D:\\java\\hadoop\\test.txt");
System.out.println(f9.lastModified());
File f10 = new File("file\\a.txt");
System.out.println(f10.lastModified());
// 将毫秒值转换为 日期 yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(f9.lastModified()));
System.out.println(sdf.format(f10.lastModified()));
}
}
创建、删除
| 方法名称 | 说明 |
|---|---|
| public boolean createNewFile() | 创建一个新的空文件 |
| public boolean mkdir() | 创建单级文件夹 |
| public boolean mkdirs() | 创建多级文件夹 |
| public boolean delete() | 删除文件、空文件夹 |
注意:delete 方法默认只能删除文件和空文件夹,delete 方法直接删除不走回收站
package com.faxont.file;
import java.io.File;
import java.io.IOException;
public class FileDemo4 {
public static void main(String[] args) throws IOException {
/*
public boolean createNewFile() 创建一个新的空文件
public boolean mkdir() 创建单级文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete() 删除文件、空文件夹
*/
// 1. 创建一个文件
// 细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回 true
// 如果当前路径表示的文件是存在的,则创建失败,方法返回 false
// 细节2:如果父级路径是不存在的,那么方法会有异常
// 细节3:createNewFile() 方法创建的一定是文件,如果路径中不包含后缀名,则返回一个没有后缀的文件
File f1 = new File("D:\\Java\\workspace\\a.txt");
System.out.println(f1.createNewFile());
// 2. 创建单级文件夹
// 细节1:Windows 当中路径是唯一的,如果当前路径已经存在,则创建失败,返回 false(例如,当前路径下有一个叫 test 的无后缀文件,我将无法再创建一个叫 test 的文件夹)
// 细节2:mkdir 方法只能创建单级文件夹,无法创建多级文件夹
File f2 = new File("D:\\Java\\workspace\\test");
System.out.println(f2.mkdir());
// 3. 创建多级文件夹
// 细节:mkdirs 既可以创建单级文件夹,也可以创建多级文件夹
File f3 = new File("D:\\Java\\workspace\\test\\a\\b\\c");
System.out.println(f3.mkdirs());
}
}
package com.faxont.file;
import java.io.File;
public class FileDemo5 {
public static void main(String[] args) {
/*
public boolean delete() 删除文件、空文件夹
细节:
如果删除的是文件,则直接删除,不走回收站
如果删除的是空文件夹,则直接删除,不走回收站
如果删除的是非空文件夹,则不能删除,返回 false
*/
// 1. 创建 File 对象
File f1 = new File("D:\\java\\workspace\\a.txt");
// 2. 删除
boolean b = f1.delete();
System.out.println(b);
}
}
获取并遍历
| 方法名称 | 说明 |
|---|---|
| public File[] listFiles() | 获取当前该路径下所有内容 |
注意:
- 当调用者 File 表示的路径不存在时,返回 null
- 当调用者 File 表示的路径是文件时,返回 null
- 当调用者 File 表示的路径是一个空文件夹时,返回一个长度为0的数组
- 当调用者 File 表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回
- 当调用者 File 表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回,包含隐藏文件
- 当调用者 File 表示的路径是需要权限才能访问的文件夹时,返回 null
package com.faxont.file;
import java.io.File;
public class FileDemo6 {
public static void main(String[] args) {
/*
public File[] listFiles() 获取当前该路径下所有内容
*/
// 1. 创建 File 对象
File f1 = new File("D:\\java\\workspace");
// 2. listFiles() 方法
// 作用:获取当前路径下文件夹里的所有内容
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
| 方法名称 | 说明 |
|---|---|
| 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) | 利用文件名过滤器获取当前该路径下所有内容 |
package com.faxont.file;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
/*
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) 利用文件名过滤器获取当前该路径下所有内容
*/
// 1. listRoots 获取系统中所有的盘符
File[] roots = File.listRoots();
System.out.println(Arrays.toString(roots));
// 2. list 获取当前路径下所有内容(仅能获取名字)
File file = new File("D:\\java\\workspace");
String[] names = file.list();
for (String name : names) {
System.out.println(name);
}
System.out.println("--------------------------------------------------------------------------------");
// 3. list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
// 需求:我现在要获取 D:\\java\\hadoop 文件夹里面所有的 txt 文件
/**
* accept 方法的形参,依次表示 hadoop 文件夹里面每一个文件或者文件夹路径
* 参数一:父级路径
* 参数二:子级路径
* 返回值:如果返回值为 true,就表示当前路径保留
* 如果返回值为 false,就表示当前路径舍弃不要
*/
File file2 = new File("D:\\java\\hadoop");
String[] list = file2.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".txt");
}
});
// String[] list = file2.list((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));
for (String name : list) {
System.out.println(name);
}
}
}
package com.faxont.file;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class FileDemo8 {
public static void main(String[] args) {
/*
(掌握)public File[] listFiles() 获取当前该路径下所有内容
public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\hadoop");
// 2. 需求:打印里面所有的 txt 文件
File[] files = file.listFiles();
for (File f : files) {
// f 表示 D:\\java\\hadoop 文件夹里面每一个文件或者文件夹的路径
if (f.isFile() && f.getName().endsWith(".txt")) {
System.out.println(f);
}
}
System.out.println("--------------------------------------------------------------------------------");
// FileFilter 和 FilenameFilter 的区别:
// FileFilter 是文件过滤器,FilenameFilter 是文件名过滤器
// 接收的参数不同
// File[] listFiles = file.listFiles(new FileFilter() {
// @Override
// public boolean accept(File pathname) {
// return pathname.isFile() && pathname.getName().endsWith(".txt");
// }
// });
File[] listFiles = file.listFiles(pathname -> pathname.isFile() && pathname.getName().endsWith(".txt"));
for (File f : listFiles) {
System.out.println(f);
}
System.out.println("--------------------------------------------------------------------------------");
// 与之前的区别:listFiles 方法返回值是一个数组,而 list 方法返回值是一个字符串数组
// File[] listFiles2 = file.listFiles(new FilenameFilter() {
// @Override
// public boolean accept(File dir, String name) {
// return new File(dir, name).isFile() && name.endsWith(".txt");
// }
// });
File[] listFiles2 = file.listFiles((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));
for (File f : listFiles2) {
System.out.println(f);
}
}
}
综合练习
File 类相关的 API 练习题
练习1
需求:
在当前模块下的 aaa 文件夹中创建一个 a.txt 文件
package com.faxont.test;
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
/*
在当前模块下的 aaa 文件夹中创建一个 a.txt 文件
*/
// 1. 创建 a.txt 的父级路径
File file = new File("file\\aaa");
if (!file.exists()) {
file.mkdir();
}
// 2. 拼接父级路径和子级路径
File src = new File(file, "a.txt");
boolean b = src.createNewFile();
if(b){
System.out.println("创建成功");
}else{
System.out.println("创建失败");
}
}
}
练习2
需求:
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)
package com.faxont.test;
import java.io.File;
public class Test2 {
public static void main(String[] args) {
/*
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\workspace");
File file2 = new File("D:\\java");
// 2. 调用方法
System.out.println(findFile(file));
System.out.println(findFile(file2));
}
public static boolean findFile(File file){
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".sql")) {
return true;
}
}
return false;
}
}
练习3
需求:
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)
package com.faxont.test;
import java.io.File;
public class Test3 {
public static void main(String[] args) {
/*
定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\workspace");
File file2 = new File("D:\\java");
// 2. 调用方法
System.out.println(findFile(file));
System.out.println(findFile(file2));
}
public static boolean findFile(File file){
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".sql")) {
return true;
}
if (f.isDirectory()) {
boolean b = findFile(f);
if (b) {
return true;
}
}
}
}
return false;
}
}
练习4
需求:
删除一个多级文件夹
package com.faxont.test;
import java.io.File;
public class Test4 {
public static void main(String[] args) {
/*
删除一个多级文件夹
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\workspace\\test\\a");
// 2. 调用方法
System.out.println(deleteDir(file));
}
public static boolean deleteDir(File dir){
File[] files = dir.listFiles();
for (File f : files) {
if (f.isFile()) {
boolean delete = f.delete();
if (!delete) {
return false;
}
} else {
boolean deleteDir = deleteDir(f);
if (!deleteDir) {
return false;
}
}
}
return dir.delete();
}
}
练习5
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
package com.faxont.test;
import java.io.File;
import java.util.HashMap;
public class Test5 {
public static void main(String[] args) {
/*
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\hadoop");
// 2. 创建 HashMap 集合,用于存储文件类型和文件个数
HashMap<String, Integer> map = new HashMap<>();
// 3. 调用方法
countFile(file, map);
map.forEach((k, v) -> System.out.println(k + ":" + v + "个"));
}
public static void countFile(File file, HashMap<String, Integer> map){
File[] files = file.listFiles();
if(files == null || files.length == 0){
throw new SecurityException(file + "是空文件夹");
}
for (File f : files) {
if(f.isFile()){
String name = f.getName();
int index = name.lastIndexOf(".");
if(index == -1 || index == name.length() - 1){
map.put("未知文件", map.getOrDefault("未知文件", 0) + 1);
}else{
String type = name.substring(index + 1);
map.put(type, map.getOrDefault(type, 0) + 1);
}
}else{
countFile(f, map);
}
}
}
}
练习6
需求:统计一个文件夹的总大小
package com.faxont.test;
import java.io.File;
public class Test6 {
public static void main(String[] args) {
/*
需求:统计一个文件夹的总大小
*/
// 1. 创建 File 对象
File file = new File("D:\\java\\hadoop");
// 2. 调用方法
System.out.println(getTotalSize(file));
}
public static long getTotalSize(File file){
File[] files = file.listFiles();
long size = 0;
for (File f : files) {
if(f.isFile()){
size += f.length();
}else{
size += getTotalSize(f);
}
}
return size;
}
}

浙公网安备 33010602011771号