Java.io.File类对文件的目录、基本操作、递归、遍历
创建和删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //创建文件 File file1 = new File( "不存在的文件.txt" ); //注意,这一步并没有创建文件,只是把磁盘中的文件封装成了一个对象 System.out.println(file1.exists() + "--" + file1.createNewFile()); //false--true。这一步是将File对象写入到磁盘中的文件中。如果文件不存在,则创建 System.out.println(file1.exists() + "--" + file1.createNewFile() + "\n" ); //true--false。如果文件已存在,则不创建 //创建目录 File dir1 = new File( "e:/a/aa" ); File dir2 = new File( "e:/a/bb" ); System.out.println(dir1.exists() + "--" + dir1.mkdir()); //false--false。mkdir只能创建最后一级目录,若父目录不存在则最后一级肯定创建失败,但不报异常 System.out.println(dir2.exists() + "--" + dir2.mkdirs()); //false--true。mkdirs可以同时创建多级目录,我们一般直接用它就行了 System.out.println(dir1.exists() + "--" + dir1.mkdir()); //false--true //创建带目录的文件 //System.out.println(new File("e:/a/demo.txt").createNewFile());//一定要注意:createNewFile只能创建文件,不能创建目录;如果目录不存在,会报异常 File dirPath = new File( "e:/不存在的目录/b" ); if (!dirPath.exists()) dirPath.mkdirs(); //如果目录不存在则先创建目录 File file = new File(dirPath, "demo.txt" ); //再在此目录中创建文件 System.out.println( "创建带目录的文件:" + file.createNewFile() + "\n" ); //true //删除文件和目录 System.out.println(dirPath.list().length); //获取指定目录下的文件名称列表,包含目录文件,但不包含目录文件中的文件。1 System.out.println(dirPath.delete()); //如果目录中有文件,则删除失败。false System.out.println(file.delete() + "--" + dirPath.delete()); //true--true System.out.println(dirPath.exists() + "--" + new File( "e:/不存在的目录" ).exists()); //false--true。注意:仅仅是删掉了最里层的目录,而其父目录并没有删除 |
get和判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static void main(String[] args) throws IOException { File file1 = new File( "a.txt" ); System.out.println(file1.length()); //0 System.out.println(file1.getName()); //a.txt System.out.println(file1.getPath()); //a.txt System.out.println(file1.getAbsolutePath()); //绝对路径,D:\workspace_bqt\JAVA\a.txt System.out.println(file1.getParent() + "\n" ); //null。注意,这里仅指[相对路径]中的父路径,如果此路径名没有指定父目录,则返回 null File file2 = new File( "e:\\demo.java" ); System.out.println(file2.length()); //195 System.out.println(file2.getName()); //demo.java System.out.println(file2.getPath()); //注意并不是仅指最后一级目录,而是指 new File() 时传进去的路径。e:\demo.java System.out.println(file2.getAbsolutePath()); //绝对路径,e:\demo.java System.out.println(file2.getParent() + "\n" ); //e:\ DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); System.out.println(dateFormat.format( new Date(file2.lastModified())) + "\n" ); //2016年5月20日 下午04时54分00秒 System.out.println(file1.exists() + "--" + file1.createNewFile() + "--" + file1.exists()); //false--true--true System.out.println(file1.isFile() + "--" + file1.isDirectory()); //true--false System.out.println( "重命名:" + file1.renameTo( new File( "e:/demo3.txt" ))); //重命名时须指定重命名后存放的路径,否则会移动到默认路径 file1 = new File( "e:/aa\\bbb" ); System.out.println(file1.mkdirs() + "--" + file1.isFile() + "--" + file1.isDirectory()); //true--false--true } |
目录相关操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | public class Test { public static void main(String[] args) throws IOException { System.out.println( "*********************************************************************************获取系统【根目录】名称列表" ); File[] fileRoots = File.listRoots(); System.out.println(Arrays.toString(fileRoots)); //[C:\, D:\, E:\] System.out.println( "*********************************************************************************获取某一【磁盘】的容量信息" ); File myFile = new File( "e:/" ); //注意,只能获取整个磁盘的容量,而不能获取此磁盘子目录的容量,子目录的容量只能通过计算得到 System.out.println(formatDataSize(myFile.getFreeSpace())); //248.45GB System.out.println(formatDataSize(myFile.getTotalSpace())); //285.74GB System.out.println(formatDataSize(myFile.getUsableSpace())); //248.45GB System.out.println( "***************************************************************************获取指定目录下的【文件名称列表】" ); //如果目录存在但是没有内容,会返回一个长度为0的数组;如果目录不存在或目录其实是一个文件,返回null String[] fileNames = myFile.list(); //包含所有文件夹以及隐藏文件 System.out.println(fileNames.length); System.out.println( "****************************************************************获取指定目录下后缀名为.txt的【文件名称列表】" ); String[] fileNames2 = myFile.list( new MyFilenameFilter( ".txt" , 0 )); //不包含子目录中的文件,如果需要,请使用递归深度遍历 for (String name : fileNames2) { System.out.println(name); //string.txt } System.out.println( "******************************************************获取指定目录下大于100Kb、后缀名为.mp3的【文件列表】" ); File[] files = myFile.listFiles( new MyFilenameFilter( ".mp3" , 1024 * 100 )); for (File f : files) { System.out.println(f); //e:\Tfboys - 大梦想家.mp3 } } /** * 格式化硬盘容量 * 注意1024默认是【int】类型的,2^32=(2^2)*(2^30)=4*(1024^3),所以int类型能表示的数最大为4G,所以绝对不能用int表示1024^4 */ public static String formatDataSize( long size) { DecimalFormat formater = new DecimalFormat( "####.00" ); if (size < 1024 ) return size + "bytes" ; else if (size < Math.pow( 1024 , 2 )) return formater.format(size * Math.pow( 1024 , - 1 )) + "KB" ; else if (size < Math.pow( 1024 , 3 )) return formater.format(size * Math.pow( 1024 , - 2 )) + "MB" ; else if (size < Math.pow( 1024 , 4 )) return formater.format(size * Math.pow( 1024 , - 3 )) + "GB" ; else if (size < Math.pow( 1024 , 5 )) return formater.format(size * Math.pow( 1024 , - 4 )) + "TB" ; else return "啥玩意啊,有这么大的硬盘吗?" ; } //****************************************************************************************** // 检索规则 //****************************************************************************************** public static class MyFilenameFilter implements FilenameFilter { private String type; private long size; /** * 检索规则 * @param type 指定后缀名的文件 * @param size 不小于指定大小的文件,单位:字节 */ public MyFilenameFilter(String type, long size) { this .type = type; this .size = size; } public boolean accept(File dir, String name) { long fileSize = new File(dir, name).length(); //System.out.println("检索过程:" + dir.getAbsolutePath() + "--" + name + "--" + fileSize); return fileSize >= size && name.endsWith(type); } } } |
获取指定目录下的全部文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | public static void main(String[] args) { List<String> filesNames = new ArrayList<String>(); getDirFilesNames( "E:/KuGou" , filesNames, null ); List<File> files = new ArrayList<File>(); getDirFiles( "E:/baiqiantao/doudou/src" , null , true , files); for (String name : filesNames) { System.out.println(name); } for (File file : files) { System.out.println(file.getName() + "--" + file.length()); } } /** * 对指定目录中的文件进行深度遍历,并按照指定过滤器进行过滤,将过滤后的内容存储到一个指定的集合中 * @param dirPath 要遍历的目录,必须是一个目录 * @param filter 只遍历目录中的指定类型的文件,如果要遍历所有文件请设为null * @param isContainDir 是否包含目录文件 * @param fileList 将结果保存到指定的集合中。由于要递归遍历(不能定义为局部变量,否则每次递归时都是把结果放到了一个新的集合中) ; * 并且是静态方法(定义为静态成员时,下次调用此方法时此集合还包含之前调用后保存的值),所以最后保存到指定的集合中 * @return 遍历到的文件数量,也即集合的大小 */ public static int getDirFiles(String dirPath, FilenameFilter filter, boolean isContainDir, List<File> fileList) { File dir = new File(dirPath); if (!dir.exists() || !dir.isDirectory()) throw new RuntimeException( "目录不存在或不是一个目录" ); if (fileList == null ) throw new RuntimeException( "指定的集合不存在" ); File[] files = dir.listFiles(); //也可以使用dir.listFiles(filter)在获取列表时直接过滤,注意这种方式检索时不要遗漏了目录文件 for (File file : files) { //遍历 if (file.isDirectory()) { //目录 if (isContainDir) { //返回集合中是否要包含目录 fileList.add(file); } getDirFiles(file.getAbsolutePath(), filter, isContainDir, fileList); //递归 } else { //文件 if (filter == null || filter.accept(dir, file.getName())) { //是否满足过滤规则 fileList.add(file); } } } return fileList.size(); } /** * 获取指定目录及其子目录下的指定格式文件的文件名,并对文件名进行格式化,并存储到一个指定的集合中 * @param dirPath 要遍历的目录,必须是一个目录 * @param filter 只遍历目录中的指定类型文件,如果要遍历所有文件请设为null * @param filePathList 将结果保存到指定的集合中。由于要递归遍历(不能定义为局部变量,否则每次递归时都是把结果放到了一个新的集合中); * 并且是静态方法(定义为静态成员时,下次调用此方法时此集合还包含之前调用后保存的值),所以最后保存到指定的集合中 * @return 遍历到的文件数量,也即集合的大小 */ public static int getDirFilesNames(String dirPath, List<String> filePathList, FilenameFilter filter) { return getDirFormatFilesNames(dirPath, filePathList, filter, true , true , true , 0 , 0 ); } /** * 获取指定目录及其子目录下的指定格式文件的文件名,并对文件名进行格式化,并存储到一个指定的集合中 * @param dirPath 要遍历的目录,必须是一个目录 * @param filePathList 将结果保存到指定的集合中 * @param filter 只遍历目录中的指定类型文件,如果要遍历所有文件请设为null * @param isContainDir 是否包含目录文件 * @param isFormat 是否格式化文件名 * @param isShowNum 是否显示编号;isFormat=true时才有效 * @param maxLeval 要遍历的最大层级(多少层目录),0代表遍历到最后一层;isFormat=true时才有效 * @param currentLvel 递归调用时结束标记,请直接设为0;isFormat=true时才有效 * @return 遍历到的文件数量,也即集合的大小 */ private static int getDirFormatFilesNames(String dirPath, List<String> filePathList, FilenameFilter filter, boolean isContainDir, boolean isFormat, boolean isShowNum, int maxLeval, int currentLvel) { File dir = new File(dirPath); if (!dir.exists() || !dir.isDirectory()) throw new RuntimeException( "目录不存在或不是一个目录" ); if (filePathList == null ) throw new RuntimeException( "指定的集合不存在" ); if ( 0 == maxLeval || currentLvel < maxLeval) { currentLvel++; File[] files = dir.listFiles(); String filePath; for ( int x = 0 ; x < files.length; x++) { if (isFormat) { if (isShowNum) filePath = getSpace(currentLvel) + currentLvel + "." + (x + 1 ) + ". " + files[x].getAbsolutePath(); else filePath = getSpace(currentLvel) + files[x].getAbsolutePath(); } else { filePath = files[x].getAbsolutePath(); } if (files[x].isDirectory()) { //如果是目录 if (isContainDir) { if (isFormat) { filePath = filePath + "\t\t★★★★★ 目录 ★★★★★" ; } filePathList.add(filePath); } getDirFormatFilesNames(files[x].getAbsolutePath(), filePathList, filter, isContainDir, isFormat, isShowNum, maxLeval, currentLvel); //递归 } else { //如果是文件 if (filter == null || filter.accept(dir, files[x].getName())) { //是否满足过滤规则 filePathList.add(filePath); } } } } return filePathList.size(); } /*** * 格式化目录 * @param level 目录层次,也即"| _ _"的个数 */ private static String getSpace( int level) { StringBuilder sb = new StringBuilder(); for ( int x = 0 ; x < level; x++) { sb.append( "| _ _ " ); } return sb.toString(); } |
删除指定目录下的全部文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 删除一个带内容的目录。必须从里面往外删。 * @param dirPath 要删除的目录,可以是文件。文件不存在时调用delete()方法不会报异常,但是返回false * @param isDeleateDir 是否删除目录 */ public static void deleateDirFiles(String dirPath, boolean isDeleateDir) { File dir = new File(dirPath); if (dir.isDirectory()) { File[] files = dir.listFiles(); //如果dir是文件的话,dir.listFiles()返回空 for (File file : files) { if (file.isDirectory()) { deleateDirFiles(file.getAbsolutePath(), isDeleateDir); //递归 } else { System.out.println( "文件【" + file + "】删除结果:" + file.delete()); } } System.out.println( " ★★★★★ 目录【" + dir.getAbsolutePath() + "】中的文件已全部删除" ); if (isDeleateDir) { System.out.println( " ★★★★★ 目录【" + dir + "】删除结果:" + dir.delete()); //删除所有内部文件后再删除目录 } } else { System.out.println( "删除结果:" + dir.delete()); } } |
分类:
Java基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具