Java--File
FIle
概述
File的构造方法
> 1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
> 2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
代码演示:
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname); // 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2); // 通过父路径和子路径字符串String parent = "d:\\aaa";String child = "bbb.txt";File file3 = new File(parent, child);// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
File的常见成员方法(判断、获取)
代码演示
public class FileIs {public static void main(String[] args) {File f = new File("d:\\aaa\\bbb.java");File f2 = new File("d:\\aaa");// 判断是否存在System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());System.out.println("d:\\aaa 是否存在:"+f2.exists());// 判断是文件还是目录System.out.println("d:\\aaa 文件?:"+f2.isFile());System.out.println("d:\\aaa 目录?:"+f2.isDirectory());}
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true
注意
File f = new File("d:/aaa.txt");
File file1 = new File("d:\\aaa.txt");
这两个 File 对象在逻辑上是指向同一个文件的。它们都指向 d: 盘根目录下的 aaa.txt 文件。在Java中,文件路径可以使用正斜杠 / 或者反斜杠 \ 来表示目录分隔符。虽然在Windows系统中,反斜杠 \ 更常见,但Java的 File 类会正确处理这两种形式。
public class FileGet {public static void main(String[] args) {File f = new File("d:/aaa/bbb.java"); System.out.println("文件绝对路径:"+f.getAbsolutePath());System.out.println("文件构造路径:"+f.getPath());System.out.println("文件名称:"+f.getName());System.out.println("文件长度:"+f.length()+"字节");File f2 = new File("d:/aaa"); System.out.println("目录绝对路径:"+f2.getAbsolutePath());System.out.println("目录构造路径:"+f2.getPath());System.out.println("目录名称:"+f2.getName());System.out.println("目录长度:"+f2.length());}}输出结果:文件绝对路径:d:\aaa\bbb.java文件构造路径:d:\aaa\bbb.java文件名称:bbb.java文件长度:636字节目录绝对路径:d:\aaa目录构造路径:d:\aaa目录名称:aaa目录长度:4096
File的常见成员方法(创建、删除)
creatNewFile
细节1:
如果当前路径表示的文件是不存在的,则创建成功,方法返回true
细节2:
如果父级路径是不存在的,那么方法会有异常IOException
细节3:
createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的 文件
mkdir
细节1:
Windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
细节2:
mkdir方法只能创建单极文件夹,无法创建多级文件夹
mkdirs
细节:
既可以创建单级的,也可以创建多级的
delete
细节:
如果删除的是文件,则直接删除,不走回收站
如果删除的是空文件夹,则直接删除,不走回收站
如果删除的是有内容的文件夹,则删除失败
代码演示:
public class FileCreateDelete {public static void main(String[] args) throws IOException {// 文件的创建File f = new File("aaa.txt");System.out.println("是否存在:"+f.exists()); // falseSystem.out.println("是否创建:"+f.createNewFile()); // trueSystem.out.println("是否存在:"+f.exists()); // true// 目录的创建File f2= new File("newDir"); System.out.println("是否存在:"+f2.exists());// falseSystem.out.println("是否创建:"+f2.mkdir()); // trueSystem.out.println("是否存在:"+f2.exists());// true// 创建多级目录File f3= new File("newDira\\newDirb");System.out.println(f3.mkdir());// falseFile f4= new File("newDira\\newDirb");System.out.println(f4.mkdirs());// true// 文件的删除System.out.println(f.delete());// true// 目录的删除System.out.println(f2.delete());// trueSystem.out.println(f4.delete());// true
}
File的常见成员方法(获取并遍历)
- `public String[] list()` :返回一个String数组,表示该File目录中的所有子文件或目录。
- `public File[] listFiles()` :返回一个File数组,表示该File目录中的所有的子文件或目录。
区别总结
- 返回类型:list() 返回字符串数组,而 listFiles() 返回 File 对象数组。
- 路径信息:list() 只返回文件名,而 listFiles() 返回包含完整路径的 File 对象。
- 筛选器:list() 使用 FilenameFilter,而 listFiles() 使用 FileFilter。
- 功能:listFiles() 提供了更多的灵活性,因为它返回的是 File 对象,可以进行更多的操作,如检查文件属性、删除文件等。
代码演示:
File dir = new File("d:\\java_code");//获取当前目录下的文件以及文件夹的名称。String[] names = dir.list();for(String name : names){System.out.println(name);}//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息File[] files = dir.listFiles();for (File file : files) {System.out.println(file);}
file综合练习
需求:
在当前模块下的aaa文件夹中创建一个a.txt文件
File f=new File("myfile/aaa");boolean mkdir = f.mkdirs();System.out.println(mkdir);//trueFile file = new File("myfile/aaa/a.txt");boolean newFile = file.createNewFile();System.out.println(newFile);//true
定义一个方法找某一个文件夹中,是否以avi结尾的电影(暂时不考虑子文件夹)
File findMoviesOfAvi(File file) {File[] files = file.listFiles();if(files!=null){for (File file1 : files) {String parrtern=".avi";if (file1.isFile()&&file1.getName().endsWith(parrtern)){return file;}}}return null;}
找到电脑中所有的以avi结尾的电影(考虑子文件夹)
public static File findMoviesOfAvi2(File file) {if (file == null || !file.isDirectory()) {return null;}File[] files = file.listFiles();if (files == null) {return null;}for (File childFile : files) {if (childFile.isDirectory()) {File result = findMoviesOfAvi2(childFile);if (result != null) {return result; // 如果在子目录中找到,立即返回}} else if (childFile.isFile() && childFile.getName().endsWith(".avi")) {return childFile; // 找到符合条件的文件,返回}}return null; // 没有找到符合条件的文件,返回空}
删除一个多级文件夹
public static boolean deleteFile(File file) {if (file == null) {return false;}if (file.isDirectory()) {File[] files = file.listFiles();if (files != null) {for (File f : files) {deleteFile(f);}}}// 尝试删除文件或目录boolean success = file.delete();if (!success) {System.err.println("Failed to delete " + file.getAbsolutePath());}return success; }
统计文件夹中的总字节数(考虑子文件夹)
public static long count(File file) {if (file == null) {return 0;}long totalSize = 0;try {File[] files = file.listFiles();if (files != null) {for (File f : files) {if (f.isDirectory()) {totalSize += count(f); // 递归计算子目录的大小} else {totalSize += f.length(); // 累加文件大小}}}} catch (SecurityException e) {System.err.println("Access denied for " + file.getAbsolutePath());}return totalSize; }
统计一个文件夹中每种文件的个数并打印(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
public static HashMap<String, Integer> countFile(File file) {HashMap<String, Integer> map = new HashMap<>();if (file == null)return null;File[] files = file.listFiles();if (files != null) {for (File f : files)if (f.isDirectory()) {//子文件夹中每一种文件的个数HashMap<String, Integer> stringIntegerHashMap = countFile(f);for (String key : stringIntegerHashMap.keySet()) {if (map.containsKey(key))map.put(key, map.get(key) + stringIntegerHashMap.get(key));}} else {String name = f.getName();String[] arr = name.split("/.");if(arr.length>=2){String endName=arr[arr.length-1];if(map.containsKey(endName)){map.put(endName,map.get(endName)+1);}else{map.put(endName,1);}}}}return map;}