Java 基础(三)| IO流之使用 File 类的正确姿势
为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。
一、什么是 File 类?
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
二、File 类的使用
2.1 构造方法
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 对象的创建。
2.2 获取功能的方法
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 实例的路径也是绝对路径时,二者是一样的。
2.3 绝对路径与相对路径
- 绝对路径:从盘符开始的完整路径
- 相对路径:相对于你当前的项目目录的路径,在开发中常用此路径
/**
* 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
2.4 判断功能的方法
判断功能的方法主要有三个,输出都是布尔值:
public boolean exists()
:指定 File 实例代表的文件或者目录是否存在public boolean isDirectory()
:指定 File 实例是不是目录public boolean isFile()
:指定 File 实例是不是文件
/**
* 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
2.5 创建与删除方法
public boolean createNewFile()
:指定 File 实例的文件不存在时,创建空文件public boolean delete()
:删除指定 File 实例表示的文件或目录public boolean mkdir()
:创建指定 File 实例表示的目录public boolean mkdirs()
:创建指定 File 实例表示的目录,以及父目录
/**
* 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
}
}
2.6 目录的遍历
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 实例都必须是在硬盘中实际存在的,否则无法遍历。
三、递归
3.1 什么是递归?
指的是程序在某个方法内自己调用自己的操作。
3.2 递归的分类
递归分为两种:
- 直接递归:称为方法自身调用自己。
- 间接递归:可以 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。
3.3 递归的使用规范
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出
- 构造方法,禁止递归
四、递归的使用
如果你不知道什么时候使用递归?那这里有一条很简单的定律:当你明确递归次数不至于造成内存溢出是,可使用;否则,不要使用。
递归有很多的使用场景,比如递归求和,递归阶乘。而递归多级目录、遍历文件、搜索文件是我们在开发中常用的,它是这么实现的:
/**
* 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源码地址:https://github.com/turoDog/review_java
最后
如果看到这里,喜欢这篇文章的话,帮忙 " 转发 "或者点个" 在看 ",行吗?祝你们 2020 暴富。微信搜索「一个优秀的废人」,欢迎关注。
回复「1024」送你一套完整的 java、python、c++、go、前端、linux、算法、大数据、人工智能、小程序以及英语教程。
回复「电子书」送你 50+ 本 java 电子书。
Java 基础(三)| IO流之使用 File 类的正确姿势的更多相关文章
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- Java基础:IO流之字节流和字符流
1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
- 2017.12.20 Java中的 IO/XML学习总结 File类详细
IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...
- java基础之io流总结二:File类基本应用
File类的概述: File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
- java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理
一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...
随机推荐
- centos linux mysql 10060远程错误代码
Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables 进入防火墙配置修改 增加以下两条防火墙 ...
- 12627 - Erratic Expansion——[递归]
Piotr found a magical box in heaven. Its magic power is that if you place any red balloon inside it ...
- cookie小总结
对cookie总结 cookie 在服务器的环境下,对数据的本地存储下面为一个小小的案例 let d= new Date; d.setDate(d.getDate()+7); document.coo ...
- CF1228——记一次和紫名失之交臂的CF
CF1228--记一次和紫名失之交臂的CF 第无数次和暴涨失之交臂 A 题目大意给定\(l,r\)输出任意一个\(l,r\)之间的每一位都不同的数 \((l <= r <= 10^5)\) ...
- 【11.61%】【codeforces 670F】Restore a Number
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- presto,dremio,spark-sql与ranger的整合记录
dremio,spark-sql,presto和ranger的整合 当前,ranger没有现成的插件来管理dremio,spark-sql,presto. 暂时使用的方法是新建一个用户,如presto ...
- HDU6333 莫队+组合数学
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: T次询问,每次询问n个苹果中最多拿m个苹果的方法数 题解: 因为T为1e5,所以直接做时间 ...
- AutoCad .Net二次开发求两曲线最小距离
测试结果: 主要思路:假设有两条曲线分别是c1和c2,把c1按照1的距离划分我这里用变量jd表示,得到一个曲线集合coll,然后遍历coll,得到coll中每一个曲线的两个端点,再用这两个端点分别求离 ...
- Visio高级应用部件
标注与公式的应用: 插入标注 怎么让标注与图形建立关联:拖动标注的时候坐下角会出现黄色的点 把标准拖动到形状边的时候让黄点进入形状就是建立了关联 然后标注就会随着形状的移动而移动 而且复制和删除也都是 ...
- Python反射笔记
通过字符串的形式,导入模块.使用__import__ In [3]: SYS = __import__("sys") In [4]: SYS.path 如果导入模块在多级文件夹下 ...