为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。
java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
File 类的构造有三种:
public File(String pathname)
: 直接通过文件路径字符串创建 public File(String parent, String child)
: 通过父和子路径字符串创建 public File(File parent, String child)
: 先创建父级 file 对象,再结合子路径创建 /** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/3 22:22 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileConstruct { public static void main(String [] args) { // 文件路径名 String pathname = "Z://file//file.txt"; File file1 = new File(pathname); System.out.println(file1); // 通过父路径和子路径字符串 String parent = "Z://file"; String child1 = "file.txt"; File file2 = new File(parent, child1); System.out.println(file2); // 通过父级 File 对象和子路径字符串 File parentDir = new File("Z://file"); String child2 = "file.txt"; File file3 = new File(parentDir, child2); System.out.println(file3); } } 复制代码
三种创建 File 对象的方法如上所示,此外需要说明的是: 一个 File 对象代表硬盘中的目录或者文件,而这个目录或文件在硬盘中是否存在不影响 File 对象的创建。
public String getAbsolutePath()
:返回指定 File 实例的绝对路径
public String getPath()
:将指定 File 实例的抽象路径名转换为一个路径名字符串
public String getName()
:返回指定 File 实例的目录或文件名
public long length()
:返回指定 File 实例的文件长度
在硬盘 Z:/file 下,新建一个 file.txt 文件,文件内容是 26 个英文字母。
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:01 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileGet { public static void main(String[] args) { File file1 = new File("Z:"+ File.separator + "file" + File.separator + "file.txt"); System.out.println("文件绝对路径:"+file1.getAbsolutePath()); System.out.println("文件构造路径:"+file1.getPath()); System.out.println("文件名称:"+file1.getName()); System.out.println("文件长度:"+file1.length()+"字节"); System.out.println("----------------------"); // 表示根目录, 在 windows 下:File.separator + "file" = "//file" File file2 = new File(File.separator + "file"); // 绝对路径 System.out.println("目录绝对路径:"+file2.getAbsolutePath()); // 构造 File 实例时的路径 System.out.println("目录构造路径:"+file2.getPath()); System.out.println("目录名称:"+file2.getName()); // file 示例为目录,所以长度 = 0 System.out.println("目录长度:"+file2.length()); } } 复制代码
File 的 get 方法如上示例,值得注意的是: getPath() 与 getAbsolutePath() 的区别在于,前者获取的是构造 File 实例时的路径,后者获取的是 File 实例的绝对路径。当构造 File 实例的路径也是绝对路径时,二者是一样的。
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:29 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FilePath { public static void main(String[] args) { // Z盘下的 file.txt 文件 File file = new File("Z://file.txt"); System.out.println(file.getAbsolutePath()); // 项目下的 file.txt 文件 File file2 = new File("file.txt"); System.out.println(file2.getAbsolutePath()); } } 输出结果: Z:/file.txt Z:/IDEAProject/review/review_java/file.txt 复制代码
判断功能的方法主要有三个,输出都是布尔值:
public boolean exists() public boolean isDirectory() public boolean isFile()
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:37 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileIs { public static void main(String[] args) { File file1 = new File("Z://file//file.txt"); File file2 = new File("Z://file"); // 判断是否存在 System.out.println("Z://file//file.txt 是否存在:"+file1.exists()); System.out.println("Z://file 是否存在:"+file2.exists()); // 判断文件 System.out.println("Z://file//file.txt 文件?:"+file1.isFile()); System.out.println("Z://file 文件?:"+file2.isFile()); // 判断目录 System.out.println("Z://file//file.txt 目录?:"+file1.isDirectory()); System.out.println("Z://file 目录?:"+file2.isDirectory()); } } 输出结果: Z:/file/file.txt 是否存在:true Z:/file 是否存在:true Z:/file/file.txt 文件?:true Z:/file 文件?:false Z:/file/file.txt 目录?:false Z:/file 目录?:true 复制代码
public boolean createNewFile() public boolean delete() public boolean mkdir() public boolean mkdirs()
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:49 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileCreateDelete { public static void main(String[] args) throws IOException { System.out.println("-----创建文件------"); // 文件的创建 File file1 = new File("file1.txt"); System.out.println("是否存在:"+file1.exists()); // false System.out.println("是否创建:"+file1.createNewFile()); // true System.out.println("是否存在:"+file1.exists()); // true System.out.println("-----创建目录------"); // 目录的创建 File file2 = new File("fileDir"); System.out.println("是否存在:"+ file2.exists());// false System.out.println("是否创建:"+ file2.mkdir()); // true System.out.println("是否存在:"+ file2.exists());// true System.out.println("-----创建多级目录------"); // 创建多级目录 File file3= new File("fileDir1//fileDir2"); System.out.println(file3.mkdir());// false File file4 = new File("fileDir1//fileDir2"); System.out.println(file4.mkdirs());// true System.out.println("-----删除文件------"); // 文件的删除 System.out.println(file1.delete());// true System.out.println("-----删除目录------"); // 目录的删除 System.out.println(file2.delete());// true System.out.println(file4.delete());// false } } 复制代码
public String[] list()
:返回一个 String 数组,表示指定 File 实例目录中的所有子文件或目录。
public File[] listFiles()
:返回一个 File 数组,表示指定 File 实例目录中的所有的子文件或目录。
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:02 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileList { public static void main(String[] args) { File dir = new File("Z://IDEAProject"); //获取当前目录下的文件以及文件夹的名称,用处不大。 String[] names = dir.list(); for(String name : names) { System.out.println(name); } System.out.println("--------------------------------"); //获取当前目录下的文件以及文件夹对象,拿到了文件对象,可以做更多操作,项目常用 File[] files = dir.listFiles(); for (File file : files) { System.out.println(file); } } } 复制代码
值得注意的是: 不管是 list() 还是 listFiles() 方法,所指定的 File 实例都必须是在硬盘中实际存在的,否则无法遍历。
递归分为两种:
如果你不知道什么时候使用递归?那这里有一条很简单的定律: 当你明确递归次数不至于造成内存溢出是,可使用;否则,不要使用。
递归有很多的使用场景,比如递归求和,递归阶乘。而递归多级目录、遍历文件、搜索文件是我们在开发中常用的,它是这么实现的:
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:15 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */ public class FileSearch { public static void main(String[] args) { // 创建 File 对象 File dir = new File("Z://IDEAProject"); // 调用文件搜索方法 searchFile(dir); } public static void searchFile(File dir) { // 获取子文件和目录 File[] files = dir.listFiles(); // 循环遍历 for (File file : files) { // 判断 if (file.isFile()) { // 输出查找的目标文件的绝对路径 if ("FileIs.java".equals(file.getName())){ System.out.println("目标文件路径:"+ file.getAbsolutePath()); } } else { // 是目录,调用自身,形成递归 searchFile(file); } } } } 输出结果: 目标文件路径:Z:/IDEAProject/review/review_java/src/main/java/com/nasus/io/file/FileIs.java 复制代码
Github源码地址: github.com/turoDog/rev…
如果看到这里,喜欢这篇文章的话,帮忙 " 转发 "或者点个" 在看 ",行吗?祝你们 2020 暴富。微信搜索「 一个优秀的废人 」,欢迎关注。
回复「 1024 」送你一套完整的 java、python、c++、go、前端、linux、算法、大数据、人工智能、小程序以及英语教程。
回复「 电子书 」送你 50+ 本 java 电子书。