Java 从入门到进阶之路(二十八)
在之前的文章我们都是通过 Java 在内存中应用,本章开始我们来看一下 Java 在系统文件(硬盘)上的操作。
系统文件就是我们电脑中的文件,简单来说就是像 Windows 系统中 C D E 等各类盘符中的文件。Java 在系统文件的操作需要通过 File 来完成。
接下来我们通过一个简单的实例来看一下 Java 在操作系统文件中的基本操作。
如上图,我们先在项目目录下创建一个 fileDemo.txt 的文件,通过电脑可以查看到它的一些属性,如名称,大小,是否可读可写等,接下来我们通过代码来对该文件进行一些操作。
1 package FileDemo; 2 3 import java.io.File; 4 5 /** 6 * java.io.File 7 * 8 * @author wjt 9 * File 可以表示一个文件或目录 10 * 使用 File 可以: 11 * 1、访问其表示的文件或目录的属性(如:名字,长度等) 12 * 2、可以创建或删除一个文件或目录 13 * 3、可以访问一个目录的所有子项信息 14 * 但是 File 不能访问一个文件的数据内容 15 */ 16 public class FileDemo1 { 17 public static void main(String[] args) { 18 // File.separator 相当于 / ,为了兼容 Windows 和 Linux 等系统 19 File file = new File("." + File.separator + "fileDemo.txt"); 20 String name = file.getName(); // 文件名 21 long len = file.length(); // 文件名的长度 22 boolean canRead = file.canRead(); // 文件是否可读 23 boolean canWrite = file.canWrite(); // 文件是否可写 24 boolean isHidden = file.isHidden(); // 文件是否隐藏 25 System.out.println("name: " + name); // name: fileDemo.txt 26 System.out.println("len: " + len); // len: 11 27 System.out.println("canRead: " + canRead); // canRead: true 28 System.out.println("canWrite: " + canWrite); // canWrite: true 29 System.out.println("isHidden: " + isHidden); // isHidden: false 30 } 31 }
通过对比我们可以看出代码运行对文件所做的打印内容和电脑属性所展示的文件名,大小,可读写性等是一样的。
接下来我们再来看一下如何创建一个文件
1 package FileDemo; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 创建一个文件 8 * 9 * @author wjt 10 */ 11 public class FileDemo2 { 12 public static void main(String[] args) throws IOException { 13 /** 14 * 在当前目录下创建文件 fileDemo2.txt 15 * 默认路径就是当前路径,即 "./",所以可以不写 16 */ 17 File file = new File("fileDemo2.txt"); 18 if (!file.exists()) { // 判断是否存在该文件 19 file.createNewFile(); 20 System.out.println("创建完毕!"); 21 } else { 22 System.out.println("文件已存在!"); 23 } 24 } 25 }
在上面都代码中,我们可以通过 file.exists() 来判断文件是否存在,然后通过 file.createNewFile() 来创建文件,需要注意都是该方法需要抛出异常,然后我们就可以在当前目录下创建我们需要都文件来。
既然能创建文件,纳闷我们就能删除文件,如下:
1 /** 2 * 删除一个文件 3 * 4 * @author wjt 5 */ 6 public class FileDemo3 { 7 public static void main(String[] args) { 8 /** 9 * 删除当前目录中都 fileDemo2.txt 文件 10 */ 11 File file = new File("fileDemo2.txt"); 12 if (file.exists()) { // 判断是否存在该文件 13 file.delete(); 14 System.out.println("删除完毕"); 15 } else { 16 System.out.println("文件不存在"); 17 } 18 } 19 }
在上面都代码中,我们可以通过 file.delete() 方法来对文件进行删除,需要注意对是这里的删除是真的删了,在电脑的回收站里是找不到的,不像电脑的删除操作,所以在进行此操作时需要特别注意!
既然可以创建文件,那么我们也就能创建文件目录,如下:
1 /** 2 * 创建一个目录 3 * 4 * @author wjt 5 */ 6 public class FileDemo4 { 7 public static void main(String[] args) { 8 // 创建一个单级目录 9 File dir1 = new File("demo"); 10 if (!dir1.exists()) { 11 dir1.mkdir(); 12 System.out.println("创建目录完毕!"); 13 } else { 14 System.out.println("该目录已存在!"); 15 } 16 // 创建一个多级目录 ./a/b/c 17 File dir2 = new File("a" + File.separator + "b" + File.separator + "c"); 18 if (!dir2.exists()) { 19 // mkdirs() 在创建当前目录的同时将所有不存在的父目录一起创建出出来 20 dir2.mkdirs(); 21 System.out.println("创建目录完毕!"); 22 } else { 23 System.out.println("该目录已存在!"); 24 } 25 } 26 }
创建文件和创建目录方法上大同小异,只不过是换成了 mkdir() 方法,但是需要注意对是在创建多级目录时所需要调用的方法是 mkdirs() 来进行创建。
同样的我们也可以对创建对目录进行删除,如下:
1 /** 2 * 删除目录 3 * @author wjt 4 */ 5 public class FileDemo5 { 6 public static void main(String[] args) { 7 File dir1 = new File("demo"); 8 if(dir1.exists()){ 9 dir1.delete(); 10 System.out.println("目录删除成功!"); 11 }else { 12 System.out.println("目录不存在!"); 13 } 14 15 File dir2 = new File("a"); 16 if(dir2.exists()){ 17 dir2.delete(); 18 System.out.println("目录删除成功!"); 19 }else { 20 System.out.println("文件不存在!"); 21 } 22 } 23 }
删除目录和删除文件所用对方法都是 delete(),我们通过该方法将刚才创建的目录 demo 和 a 进行删除,可以发现 demo 目录被删除成功了,a 目录虽然也打印了 “目录删除成功”,但是并没有真正的删除掉,这是因为 a 目录并不是一个空目录,如果想要删该目录,需要老老实实一级一级进行删除!如下代码:
1 /** 2 * 获取一个目录中所有的子项 3 * 4 * @author wjt 5 */ 6 public class FileDemo6 { 7 public static void main(String[] args) { 8 // 获取当前目录中的所有子项 9 File dir = new File("."); 10 /** 11 * boolean isFile() 判断是否为一个文件 12 * boolean isDirectory() 判断是否为一个目录 13 */ 14 if (dir.isDirectory()) { 15 /** 16 * File[] listFiles() 获取所有子项 17 */ 18 File[] subs = dir.listFiles(); 19 for (File sub : subs) { 20 if (sub.isFile()) { 21 System.out.print("文件:"); 22 } else { 23 System.out.print("目录:"); 24 } 25 System.out.println(sub.getName()); 26 // 文件:demo.iml 27 // 目录:out 28 // 目录:a 29 // 文件:fileDemo.txt 30 // 目录:.idea 31 // 目录:src 32 } 33 } 34 } 35 }
在上面的代码中,我们可以获取到某一个目录下所有到文件和目录,那么我们就可以实现一个方法来对指定目录进行删除,如下
1 /** 2 * 删除多级目录 3 */ 4 public class FileDemo7 { 5 public static void main(String[] args) { 6 File dir = new File("a"); 7 delete(dir); 8 } 9 10 public static void delete(File file) { 11 if (file.isDirectory()) { 12 // 将其所有子项删除 13 File[] subs = file.listFiles(); 14 for (File sub : subs) { 15 // 递归调用 16 delete(sub); 17 } 18 } 19 file.delete(); 20 } 21 }
通过上面对方法我们可以将多级目录进行删除,其中我们用到了递归操作!递归操作开销还是挺大对,在程序中应尽量避免!
我们在上面的代码中用到了 listFiles() 方法来获取当前目录下所有的文件和目录,当然我们也可以通过该方法获取到我们想要的文件或目录,如下:
1 /** 2 * 获取一个目录中符合条件对部分子项 3 * 使用重载对 listFiles 方法,需要传入一个额外的文件过滤器 4 * 文件过滤器是一个接口:FileFilter 5 * 6 * @author wjt 7 */ 8 public class FileDemo8 { 9 public static void main(String[] args) { 10 File dir = new File("."); 11 // 获取名字以 "." 开头的子项 12 File[] subs = dir.listFiles(new FileFilter() { 13 @Override 14 public boolean accept(File file) { 15 return file.getName().startsWith("."); 16 } 17 }); 18 for (File sub : subs) { 19 System.out.println(sub.getName()); // .idea 20 } 21 } 22 }