【Directory】文件操作(初识文件操作二)
上篇我们说了关于文件的创建删除更改可以通过File这个类来完成。对于目录的操作其实File类也可以完成创建删除等相关的操作。用法跟文件的方法大致相同。
那么下面就一起来看一下关于目录相关的用法。
一,通过File类创建目录
1.创建单层目录
package Test1; import java.io.File; public class CreatSingleDir { public static void creatSingleDir(String string){ File dir = new File(string); if(dir.exists()){ return; }else{ dir.mkdir(); System.out.println("目录创建成功!"); } } }
测试类:
package Test1; public class TestDir { public static void main(String[] args) { CreatSingleDir creat = new CreatSingleDir(); creat.creatSingleDir("C:/Users/IBM_ADMIN/Desktop/DirTestDemo"); } }
2.创建多层目录
package Test1; import java.io.File; public class CreatMultDir { public static void creatMultDir(String string) { File dir = new File(string); if (!dir.exists()) { dir.mkdirs(); System.out.println("多目录创建成功!"); } return; } }
测试类:
package Test1; public class TestDir { public static void main(String[] args) { CreatMultDir mult = new CreatMultDir(); mult.creatMultDir("C:/Users/IBM_ADMIN/Desktop/DirTestDemo/test1/test2/test3"); } }
注意事项:
1.单层目录的创建跟多层目录的创建都是通过File类实例化后的方法来创建
2.区别在于单层目录使用的是.mkdir()而创建多层目录使用的是.mkidirs()方法
3.建议不管是创建单层还是多层目录首先先通过.exists()方法去判断下创建的目录是否已存在
二,通过File类修改文件,目录名
package Test1; import java.io.File; public class TestDir { public static void main(String[] args) { File file1 = new File("C:/Users/IBM_ADMIN/Desktop/111"); File file2 = new File("C:/Users/IBM_ADMIN/Desktop/222"); File file3 = new File("C:/Users/IBM_ADMIN/Desktop/333.txt"); File file4 = new File("C:/Users/IBM_ADMIN/Desktop/444.txt"); file1.renameTo(file2); //把file1中的目录名变为file2中的目录名 file3.renameTo(file4); //把file3中的文件文件名变为file4中的文件名 } }
结果:
三,通过File类列出指定目录下的所有目录及文件
package Test1; import java.io.File; public class TestDir { public static void main(String[] args) { File dir = new File("C:/Users/IBM_ADMIN/Desktop/NewDirectory"); for (String d : dir.list()) { //通过.list()方法把上述指定路径下的所有目录跟文件显示出来。注意:这里显示的不包含下层目录中的子目录及文件 System.out.println(d); } } }
结果注意事项:显示出来的是当前目录下的所有文件于目录。并不包含子目录下的目录及文件
四,通过File类删除目录(必须为空目录)
package Test1; import java.io.File; public class DeleteSingleDir { public static void deleteSingleDir(String string) { File dir = new File(string); if (!dir.exists()) { System.out.println("目录不存在,删除失败!"); } else { dir.delete(); System.out.println("目录删除成功!"); } } }
测试类:
package Test1; import java.io.File; public class TestDir { public static void main(String[] args) { DeleteSingleDir sdir = new DeleteSingleDir(); sdir.deleteSingleDir("C:/Users/IBM_ADMIN/Desktop/tonyliu"); } }
结果:
删除前
删除后
注意事项:
deleteSingleDir方法中的.delete()方法只针对空目录才可以进行删除。如果目录中有文件或子目录的话,.delete()是无法进行删除的。
五,通过File类递归删除目录或文件
注意事项:这里说到了递归,顾名思义通过原有的.delete()方法是无法直接删除有文件的目录以及下属子目录的。那么要想删除,必须手动编写递归方法来进行删除。
下面的代码中包含了递归方法,详细请参考代码段及注释。
package Test1; import java.io.File; public class DeleteMultDir { public static void DeleteMultDir(String string) { File mult = new File(string); if (!mult.exists()) { System.out.println("目录不存在,无法删除!"); } if (delete(mult)) System.out.println("删除成功!"); else System.out.println("删除失败!"); } /** * 递归删除 * * @param current * @return */ public static boolean delete(File current) { boolean flag = true; for (File file : current.listFiles()) { if (file.isDirectory()) { flag = flag && delete(file); // flag为退出标识符.而delete(file)delete是递归,file为遍例出来的目录.把每个目录作为参数传递. } } return flag && current.delete(); // 如果遍例出来的是文件不是目录就不会执行上面这句代码.就执行current.delete()方法删除文件. } }
测试类:
package Test1; import java.io.File; public class TestDir { public static void main(String[] args) { DeleteMultDir mult = new DeleteMultDir(); mult.DeleteMultDir("C:/Users/IBM_ADMIN/Desktop/Dirdemo1"); } }
结果:
脚本执行前:
脚本执行后:
五,通过File类列举目录(指列举当前目录下子目录与文件)
package Test1; import java.io.File; public class ListSingDirOrFiles { public static void listSingleDirOrFiles(String string) { File files = new File(string); if (files != null) { for (String fil : files.list()) { System.out.println(fil); } } } }
测试类:
package Test1; import java.io.File; import java.io.IOException; import Test.CreatNewFiles; public class TestDir { public static void main(String[] args) throws IOException { ListSingDirOrFiles dirs = new ListSingDirOrFiles(); dirs.listSingleDirOrFiles("C:/Users/IBM_ADMIN/Desktop/liupeng/demo1"); } }
结果:
六,通过File类列举目录(包含递归列举目录下子目录及子文件)
package Test1; import java.io.File; import java.util.Scanner; public class ListMultDirOrFiles { public static void listMultDirOrFiles() { Scanner input = new Scanner(System.in); System.out.println("请输入查找目录:"); String fileName = input.next() + File.separator; // File.separator可以理解为路经连接符.例如(C:\)中的\,因为系统不同如果是Linux可能是/tmp的写法.因此为了不区分系统,统一用File.separator. File files = new File(fileName); printFiles(files); } /** * 递归遍例目录,文件 * * @param f */ public static void printFiles(File f) { if (f != null) { // 判断是否为空 if (f.isDirectory()) { // 如果是目录 File[] fileArray = f.listFiles(); // list出该目录下的所有文件包括子目录,并传递fileArray集合中 for (int i = 0; i < fileArray.length; i++) { // 递归循环 printFiles(fileArray[i]); } } else { System.out.println(f); } } } }
测试类:
package Test1; import java.io.File; import java.io.IOException; import Test.CreatNewFiles; public class TestDir { public static void main(String[] args) throws IOException { ListMultDirOrFiles mult = new ListMultDirOrFiles(); mult.listMultDirOrFiles(); } }
结果:
关于文件操作还有很多复杂但是日常业务中经常用到的案例。比如在一个文件夹下统一删除后缀为,什么什么的文件。如何一并更改文件后缀,如何一扩copy文件等。具体的使用方法在日后具体情况下再陆续更新。对于初学者的我来说,也需要点时间思考一下某些固定情况下如何更高效的完成文件操作的便利化。会在接下来的篇章中更新其用法。
坚信只要不断努力,终会达成梦想!