java 删除文件-java文件如何改成jsp文件
目录
本文是java IO总结系列的第四篇。 第一篇文章的访问地址如下:
总结java中创建和写入文件的5种方式-JAVA IO基础知识总结第1部分
总结java从文件中读取数据的6种方法——JAVA IO基础总结Part 2
总结java中创建文件夹的4种方法及其优缺点——JAVA IO基础总结之第三部分
为了方便大家理解,我特意做了一个对应这篇文章的视频:总结7种删除文件或文件夹的方法
一、删除文件或文件夹的四种基本方法
以下四种方法可以删除文件或文件夹。 它们的共同点是:当文件夹中有子文件时,删除会失败,也就是说这四种方法只能删除空文件夹。
需要注意的是,传统IO中的File类和NIO中的Path类都可以表示文件和文件夹。
文件类的delete()
文件类的 deleteOnExit()
文件。 删除(路径路径)
Files.deleteIfExists(Path 路径);
它们的区别:
成功返回值是否可以判断文件夹是否不存在导致失败。 是否可以判断文件夹是否不为空导致失败。 评论
文件类的delete()
真的
不能(返回false)
不能(返回false)
传统输入输出
文件类的 deleteOnExit()
空白
否,但如果不存在,则不会删除
不能(返回无效)
传统IO,这个坑,避免使用
文件。 删除(路径路径)
空白
NoSuchFileException异常
目录非空异常
NIO,作者推荐使用
Files.deleteIfExists(Path 路径);
真的
错误的
目录非空异常
蔚来
从上面的对比可以看出,传统的IO方式删除一个文件或文件夹,删除失败时最多返回一个false。 通过这个false无法发现删除失败的具体原因,难道是文件本身没有删除失败? 还是因为文件夹不为空导致删除失败?
NIO 方法在这一点上更好。 删除成功或失败都有具体的返回值或异常信息java 删除文件,有助于我们在删除文件或文件夹时更好地处理程序中的异常。
需要注意的是,传统IO中的deleteOnExit方法,我觉得应该避免。 它永远只会返回void,删除失败不会抛出Exception,所以我建议不要使用它java 删除文件,以免你删除失败时没有任何反应,误以为删除成功了。
//false只能告诉你失败了 ,但是没有给出任何失败的原因 @Test void testDeleteFileDir1() { File file = new File("D:\\data\\test"); boolean deleted = file.delete(); System.out.println(deleted); } //void ,删除失败没有任何提示,应避免使用这个方法,就是个坑 @Test void testDeleteFileDir2() { File file = new File("D:\\data\\test1"); file.deleteOnExit(); } //如果文件不存在,抛出NoSuchFileException //如果文件夹里面包含文件,抛出DirectoryNotEmptyException @Test void testDeleteFileDir3() throws IOException { Path path = Paths.get("D:\\data\\test1"); Files.delete(path); //返回值void } //如果文件不存在,返回false,表示删除失败(文件不存在) //如果文件夹里面包含文件,抛出DirectoryNotEmptyException @Test void testDeleteFileDir4() throws IOException { Path path = Paths.get("D:\\data\\test1"); boolean result = Files.deleteIfExists(path); System.out.println(result); }
归根结底还是推荐大家使用java NIO的Files.delete(Path路径)和Files.deleteIfExists(Path路径); 删除文件或文件夹。
2.如何删除整个目录或目录下的部分文件
上面说到,四个API删除文件夹时,如果文件夹中有子文件,删除会失败。 那么如果我们真的要删除整个文件夹呢?
先决条件准备
为了方便我们后面的实验,先建立这样一个目录结构,“.log”以数据文件结尾,其他都是文件夹
可以使用表示的代码创建
private void createMoreFiles() throws IOE编程客栈xception { Files.createDirectories(Paths.get("D:\\data\\test1\\test2\\test3\\test4\\test5\\")); Files.write(Paths.get("D:\\data\\test1\\test2\\test2.log"), "hello".getBytes()); Files.write(Paths.get("D:\\data\\test1\\test2\\test3\\test3.log"), "hello".getBytes()); }
2.1. walkFileTree 和 FileVisitor
使用walkFileTree方法遍历整个文件目录树,使用FileVisitor对遍历的每个文件或文件夹进行处理
FileVisitor的visitFile方法用于处理遍历结果中的“文件”,所以我们可以在该方法中删除文件
FileVisitor的postVisitDirectory方法,注意方法中的“post”是“稍后再做...”的意思,所以是用来处理文件处理完后的文件夹,所以使用该方法删除文件夹可以有效避免文件夹例外的是内容不为空,因为在删除文件夹之前,文件夹中的文件已经被删除了。
@Test void testDeleteFileDir5() throws IOException { createMoreFiles(); Path path = Paths.get("D:http://www.cppcns.com\data\\test1\\test2"); Files.walkFileTree(path, new SimpleFileVisitor() { // 先去遍历删除文件 @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); System.out.printf("文件被删除 : %s%n", file); return FileVisitResult.CONTINUE; } // 再去遍历删除目录 @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); System.out.printf("文件夹被删除: %s%n", dir); return FileVisitResult.CONTINUE; } } ); }
下面的输出显示了文件被删除的顺序
文件删除:D:\data\test1\test2\test2.log
文件删除:D:\data\test1\test2\test3\test3.log
删除文件夹:D:\data\test1\test2\test3\test4\test5
删除文件夹:D:\data\test1\test2\test3\test4
删除文件夹:D:\data\test1\test2\test3
文件夹被删除:D:\data\test1\test2
由于我们可以遍历文件夹或文件,因此我们可以在处理过程中对其进行过滤。 例如:
2.2. 文件。 走
如果你不熟悉 Stream 流语法,这个方法有点难以理解,但说实话很简单。
使用Files.walk遍历文件夹(包括子文件夹及其文件),遍历的结果是一个Stream
要处理每个遍历的结果,只需调用 Files.delete。
@Test void testDeleteFileDir6(RviVR) throws IOException { createMoreFiles(); Path path = Paths.get("D:\\data\\test1\\test2"); try (Streamwalk = Files.walk(path)) { walk.sorted(Comparator.reverseOrder()) .forEach(DeleteFileD编程客栈ir::deleteDirectoryStream); } } private static void deleteDirectoryStream(Path path) { try { Files.delete(path); System.out.printf("删除文件成功:%s%n",path.toString()); } catch (IOException e) { System.err.printf("无法删除的路径 %s%n%s", path, e); } }
问:如何先删除文件再删除文件夹? . 使用字符串排序规则。 从字符串排序规则来看,“D:\data\test1\test2”一定在“D:\data\test1\test2\test2.log”之前。 所以我们使用“sorted(Comparator.reverseOrder())”来颠倒Stream的顺序来达到先删文件再删文件夹的目的。
下面输出的是最终执行结果的删除顺序。
成功删除文件:D:\data\test1\test2\test3\test4\test5
成功删除文件:D:\data\test1\test2\test3\test4
文件删除成功:D:\data\test1\test2\test3\test3.log
成功删除文件:D:\data\test1\test2\test3
文件删除成功:D:\data\test1\test2\test2.log
文件删除成功:D:\data\test1\test2
2.3. 传统IO-递归遍历删除文件夹
传统递归删除文件或文件夹的方法比较经典
//传统IO递归删除 @Test void testDeleteFileDir7() throws IOException { createMoreFiles(); File file = new File("D:\\data\\test1\\test2"); deleteDirectoryLegacyIO(file); } private void deleteDirectoryLegacyIO(File fwww.cppcns.comile) { File[] list = file.listFiles(); //无法做到list多层文件夹数据 if (list != null) { for (File temp : list) { //先去递归删除子文件夹及子文件 deleteDirectoryLegacyIO(temp); //注意这里是递归调用 } } if (file.delete()) { //再删除自己本身的文件夹 System.out.printf("删除成功 : %s%n", file); } else { System.err.printf("删除失败 : %s%n", file); } }
需要注意的是:
listFiles()方法只能列出文件夹下一层文件或文件夹,不能列出子文件夹及其子文件。先递归删除子文件夹,再删除文件夹本身
以上就是javaio文件操作删除文件或文件夹的7种方法的详细介绍。 更多javaio文件操作删除文件或文件夹,请关注我们的其他相关文章!
本文标题:javaio文件操作删除文件或文件夹的7种方法