介绍:
File对象表示路径,可以是文件,也可以是文件夹。这个路径可以是存在的,也可以是不存在的,带盘符的路径是绝对路径,不带盘符的路径是相对路径,相对路径默认到当前项目下去找
构造方法:
public File(String pathname) 把字符串表示的路径变成File对象 public File(String parent, String child) 把父级路径和子级路径进行拼接 public File(File parent, String child) 把父级路径和子级路径进行拼接
代码演示:
public class FileDemo1 {
public static void main(String[] args) {
/*
public File(String pathname) 把字符串表示的路径变成File对象
public File(String parent, String child) 把父级路径和子级路径进行拼接
public File(File parent, String child) 把父级路径和子级路径进行拼接
*/
//路径 C:\Users\han\Desktop
//1.public File(String pathname) 把字符串表示的路径变成File对象
String str = "C:\\Users\\han\\Desktop";
File f1 = new File(str);
System.out.println(f1);
//2.public File(String parent, String child) 把父级路径和子级路径进行拼接
String parent = "C:\\Users\\han";
String child = "Desktop";
File f2 = new File(parent,child);
System.out.println(f2);
//3.public File(File parent, String child) 把父级路径和子级路径进行拼接
File parent2 = new File("C:\\Users\\han");
String child2 = "Desktop";
File f3 = new File(parent2,child2);
System.out.println(f3);
}
}
运行结果:
成员方法:
1.判断和获取
下面来进行演示:
这里我先在D盘的JavaFileTest文件夹中创建了文件夹aaa和文件a.txt
文件夹aaa中有一个文件b.txt,存储80个1,大小为80字节
文件a.txt中只有三个字符123,大小为3字节
代码演示:
public class FileDemo2 {
public static void main(String[] args) {
/*
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 boolean isDirectory() 判断此路径名表示的File是否为文件夹
//public boolean isFile() 判断此路径名表示的File是否为文件
//public boolean exists() 判断此路径名表示的File是否存在
//1.对文件进行判断
File f1 = new File("D:\\JavaFileTest\\a.txt");
System.out.println(f1.isDirectory());
System.out.println(f1.isFile());
System.out.println(f1.exists());
//2.对文件夹进行判断
System.out.println("------------------------");
File f2 = new File("D:\\JavaFileTest\\aaa");
System.out.println(f2.isDirectory());
System.out.println(f2.isFile());
System.out.println(f2.exists());
//3.对不存在路径进行判断
System.out.println("------------------------");
File f3 = new File("D:\\JavaFileTest\\abc");
System.out.println(f3.isDirectory());
System.out.println(f3.isFile());
System.out.println(f3.exists());
//获取
System.out.println("------------------------");
//public long length() 返回文件的大小(字节数量)
System.out.println("------------------------");
System.out.println(f1.length());
//注意:这个方法只能获取文件的大小,单位是字节
//如果单位是M、G,可以不断除1024
System.out.println(f2.length());
//无法获取文件夹的大小
//如果要获取文件夹的大小,需要把文件夹中的所有文件大小累加在一起
//public String getAbsolutePath() 返回文件的绝对路径
System.out.println("------------------------");
System.out.println(f1.getAbsoluteFile());
System.out.println(f2.getAbsoluteFile());
//这里在idea中此模块新建了一个文件a.txt
File f4 = new File("file\\a.txt");
System.out.println(f4.getAbsoluteFile());
//public String getPath() 返回定义文件时使用的路径
System.out.println("------------------------");
System.out.println(f1.getPath());
System.out.println(f2.getPath());
System.out.println(f4.getPath());
//public String getName() 返回文件的名称,带后缀
System.out.println("------------------------");
System.out.println(f1.getName());
System.out.println(f2.getName());
System.out.println(f4.getName());
//public long lastModified() 返回文件的最后修改时间(时间毫秒值)
System.out.println("------------------------");
long lastModified1 = f1.lastModified();
System.out.println(lastModified1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf.format(lastModified1));
}
}
运行结果:
2.创建和删除
这里仍然是在D盘中JavaFileTest文件中创建一个文件a.txt和一个文件夹aaa内容包括一个文件b.txt。
代码演示:
public class FileDemo3 {
public static void main(String[] args) throws IOException {
/*
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 创建单极文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete() 删除文件、空文件夹
*/
//1.public boolean createNewFile() 创建一个新的空的文件
//创建一个不存在的文件
System.out.println("创建一个不存在的文件");
File f1 = new File("D:\\JavaFileTest\\b.txt");
boolean b1 = f1.createNewFile();
System.out.println(b1);
//创建一个已经存在的文件
System.out.println("创建一个已经存在的文件");
File f2 = new File("D:\\JavaFileTest\\a.txt");
boolean b2 = f2.createNewFile();
System.out.println(b2);
//细节1:如果创建一个父级路径不存在的文件,那么会有异常IOException
/*细节2:createNewFile方法创建的一定是文件,
如果路径中不包含后缀名,则创建一个没有后缀的文件
*/
System.out.println();
//2.public boolean mkdir() 创建单极文件夹
//创建已经存在的路径(包括已经创建的文件的路径)的文件夹
System.out.println("创建已经存在的路径(包括已经创建的文件的路径)的文件夹");
File f3 = new File("D:\\JavaFileTest\\aaa");
boolean b3 = f3.mkdir();
System.out.println(b3);
//创建一个不存在的路径的文件夹
System.out.println("创建一个不存在的路径的文件夹");
File f4 = new File("D:\\JavaFileTest\\bbb");
boolean b4 = f4.mkdir();
System.out.println(b4);
//创建一个多级文件夹
System.out.println("创建一个多级文件夹");
File f5 = new File("D:\\JavaFileTest\\aaa\\bbb\\ccc");
boolean b5 = f5.mkdir();
System.out.println(b5);
System.out.println();
//3.public boolean mkdirs() 创建多级文件夹
System.out.println("创建多级文件夹");
//细节:mkdirs方法既可以创建单极文件夹,又可以创建多级文件夹
File f6 = new File("D:\\JavaFileTest\\aaa\\bbb\\ccc");
boolean b6 = f6.mkdirs();
System.out.println(b6);
System.out.println();
//4.public boolean delete() 删除文件、空文件夹
//删除已存在文件
System.out.println("删除已存在文件");
boolean b7 = f1.delete();
System.out.println(b7);
//删除不存在的文件
System.out.println("删除不存在的文件");
File f8 = new File("D:\\JavaFileTest\\abcdefg");
boolean b8 = f8.delete();
System.out.println(b8);
//删除有内容的文件夹
System.out.println("删除有内容的文件夹");
boolean b9 = f3.delete();
System.out.println(b9);
//删除空文件夹
System.out.println("删除空文件夹");
boolean b10 = f4.delete();
System.out.println(b10);
}
}
运行结果:
3.获取并遍历
这里仍然是在D盘中JavaFileTest文件中创建一个文件a.txt和一个文件夹aaa内容包括一个文件b.txt。
代码演示:
public class FileDemo4 {
public static void main(String[] args) {
File f1 = new File("D:\\JavaFileTest");
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
运行结果:
注意:
1.当调用者File表示的路径不存在时,返回null
2.当调用者File表示的路径是文件时,返回null
3.当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
4.当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在FIle数组中返回
5.当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在FIle数组中返回,包含隐藏文件
6.当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
获取并遍历还有其他一些方法,如下:
这些方法只需了解即可,重点掌握上述listFiles方法。
练习题:
先创建好文件和文件夹
JavaFileTest文件夹:
aaa文件夹:(只存储空文件夹ccc)
bbb文件夹:
练习一
在当前模块下的aaa文件夹中创建一个a.txt
代码演示:
public class FileTest1 {
public static void main(String[] args) throws IOException {
File parent = new File("C:\\Users\\Han\\IdeaProjects\\file\\aaa");
String name = "a.txt";
File file = new File(parent,name);
boolean b = file.createNewFile();
System.out.println(b);
}
}
运行结果:
练习二
定义一个方法找某一个文件夹中,是否有以.xls结尾的工作表 (暂时不需要考虑子文件夹)
代码演示:
public class FileTest2 {
public static void main(String[] args) {
//对文件夹aaa判断
File f1 = new File("D:\\JavaFileTest\\aaa");
boolean b1 = existXls(f1);
System.out.println(b1);
//对文件夹bbb判断
File f2 = new File("D:\\JavaFileTest\\bbb");
boolean b2 = existXls(f2);
System.out.println(b2);
}
//定义方法
public static boolean existXls(File file) {
//遍历
File[] files = file.listFiles();
if(files == null) {
return false;
}
for (File f : files) {
if(f.isFile() && f.getName().endsWith(".xls")) {
return true;
}
}
return false;
}
}
运行结果:
练习三
找到电脑中所有以.xls结尾的工作表 (需要考虑子文件夹)
代码演示:
public class FileTest3 {
public static void main(String[] args) {
File[] roots = File.listRoots();
for (File root : roots) {// C:\ D:\
ergodicFile(root);
}
}
//遍历一个文件夹,并输出所有.xls文件
public static void ergodicFile(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if(file.isDirectory()){
//如果是文件夹
ergodicFile(file);
} else {
//如果是文件
String name = file.getName();
if(name.endsWith(".xls")) {
System.out.println(name);
}
}
}
}
}
}
运行结果:
练习四
删除一个多级文件夹
代码演示:
public class FileTest4 {
public static void main(String[] args) {
File f1 = new File("D:\\JavaFileTest\\aaa");
deleteFile(f1);
}
//遍历一个文件夹,并删除所有文件
public static void deleteFile(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if(file.isDirectory()){
//如果是文件夹
deleteFile(file);
} else {
//如果是文件
file.delete();
}
}
}
dir.delete();
}
}
运行结果:
成功删除aaa多级文件夹
练习五
统计一个文件夹中每种文件的个数并打印 (考虑子文件夹) 打印格式如下: txt:2个 doc:3个 xls:1个
代码演示:
public class FileTest5 {
static HashMap<String,Integer> hm = new HashMap<>();
public static void main(String[] args) {
File file = new File("D:\\JavaFileTest");
getAllKindsOfFile(file);
hm.forEach((key, count) -> System.out.println(key + ":" + count + "个"));
}
public static void getAllKindsOfFile(File src) {
File[] files = src.listFiles();
for (File file : files) {
//遍历
if(file.isFile()) {
//是文件
String name = file.getName();
if(name.contains(".")) {
String[] arr = name.split("\\.");//单一个.表示任意字符,加上转义字符才表示.
String kind = arr[arr.length - 1];
if(hm.containsKey(kind)) {
//如果集合中已存在
hm.put(kind,hm.get(kind) + 1);
} else {
//如果集合中未存在
hm.put(kind,1);
}
}
} else {
//是文件夹
getAllKindsOfFile(file);
}
}
}
}