序言:
上一篇我们介绍了,File 描述相对路径和绝对路径的相关知识,并重点讲解了getAbsolutePath() 和 getCanonicalPath()两个方法的用法和区别;
这一篇,我们重点介绍,File类 一些常用的 属性和方法;
一、属性
Modifier and Type | 属性描述 |
---|---|
static String | pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。 |
static String | separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。 |
首先 我们来比较一下, 下面两个属性的不同点:
pathSeparator 属性 代表 ; 分隔符
separator 属性 代表 / (微软 使用的 路径 分隔符 为 \ )
System.out.println("pathSeparator 属性表示的分隔符为 "+File.pathSeparator);
System.out.println("separator 属性表示的分隔符为 "+File.separator);
结果:
pathSeparator 属性表示的分隔符为 ;
separator 属性表示的分隔符为 \
这里 重点说明一下 separator 属性:因为在不同的操作系统环境下(其实就是微软和其他),所代表的分隔符 是有差异的;
引用知乎用户的解释:
知乎用户:“在绝大多数地方,用的都是/(slash),包括Mac/Linux,也包括URL。你唯一需要记住的是,Microsoft这个怪鸡在自己的操作系统里面偏要用\(backslash),使得自己与众不同。
根据上面的说法,你很容易记住谁是“正”斜杠,谁是“反”斜杠,这个世界上就只有Microsoft是反的,别人都是“正”的,因为它用的那个叫做 backslash。
Linux使用斜杠/作为路径分隔符,而Web应用最先是使用在Linux系统上面,所以目前所有的网络地址都采用斜杠/作为分隔符。
Window 则使用的是 \ 作为路径分隔符:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KOdru1oB-1592989674966)(img\file\path3.png)]
有没有发现,\ 在编程语言中 有特定的含义 - 叫做 转义字符;
所以 上图的路径 ,我们在程序中,有时也可以 这样表示
c:\\ServYou\\APP
二 、方法
假设我们有一个业务场景 :
①、 首先我们需要查看 文件存储设备的空间,是否满足我们存储的条件;
②、如果满足条件,那么 我们需要 判断,该抽象路径所表示的真实路径,是否有这个文件;
③、 存在两种情况:
- 如果有,查看该文件的权限;并返回该文件的类型;
- 如果没有 ,则创建 一个空白文件;
④、最后我们删除该文件;
根据这个业务场景,我们开始学习 解决这些问题的方法;
1、查看存储设备空间的相关方法:
修饰符和返回类型 | Method and Description |
---|---|
long | getFreeSpace( ) :返回分区未分配的字节数 |
long | getTotalSpace():通过此抽象路径名返回分区大小 |
long | getUsableSpace():返回分区上的提供给该虚拟机的字节数 |
这里说明一下 ,我代码的工作空间是存放在 E 盘下:
E盘的存储状态:
那么 getFreeSpace()方法返回的就是 E 盘未使用的 空闲空间信息,单位为字节;
File file = new File("src\\newfile.txt");
System.out.println("FreeSpace 为 :"+file.getFreeSpace()/1024/1024/1024+"G");
执行的结果:
FreeSpace 为 :274G
getTotalSpace() 方法返回 E盘的所有空间信息(包括已使用的和未使用的),单位为字节;
File file = new File("src\\newfile.txt");
System.out.println("TotalSpace 为 :"+file.getTotalSpace()/1024/1024/1024+"G");
执行的结果:
TotalSpace 为 :316
getUsableSpace() 返回该虚拟机在此抽象名称所命名的分区上可用的空间信息(当前虚拟机使用的是E 盘空间),单位为字节
File file = new File("src\\newfile.txt");
System.out.println("UsableSpace为 :"+file.getUsableSpace()/1024/1024/1024+"G");
执行结果:
UsableSpace 为 :274G
对比一下 getFreeSpace 和 getUsableSpace 方法,虽然结果相同,但是 代表的逻辑不同:
java.io.File.getFreeSpace()方法返回此抽象路径名所命名的分区中未分配的字节数。返回的未分配字节数不保证。在此调用之后,未分配的字节数很可能是准确的,并且任何外部I / O操作都不准确。
java.io.File.getUsableSpace()方法返回该虚拟机在此抽象名称所命名的分区上可用的字节数。当此方法检查写入权限和其他操作系统限制时,通常可以更准确地估计实际可以写入多少新数据。
总结一下:
getFreeSpace 表示存储设备 未使用的总空间,不会 检查 写入权限,当有其他的进程正在使用空间时,很有可能 计算的空闲空间信息不是特别准确;
getUsableSpace 表示虚拟机分配可使用的空闲空间,会检查写入权限,预估的空闲空间较为准确;
2、判断 抽象路径 所表示的 物理路径上的文件是否存在
修饰符和类型 | 方法和描述 |
---|---|
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
这个没啥好说的 ,就是判断 实际路径上是否存在该文件;
File file = new File("src/fileInputStream.txt");
if (file.exists()) {
log.info("在相对 src 路径下存在 一个fileInputStream.txt 文件~~ ");
} else {
log.info("在相对 src 路径下不存在该文件~~ ");
}
3、判断文件权限和文件类型的方法
修饰符和类型 | 方法和描述 |
---|---|
boolean | canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean | canRead() 测试应用程序是否可以读取由此抽象路径名表示的文件。 |
boolean | canWrite() 测试应用程序是否可以修改由此抽象路径名表示的文件。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否为目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否为普通文件。 |
首先我将 fileInputStream.txt 文件的权限设置为只读;
直接上列子:
①、权限信息
@Test
public void testFilePermission(){
File file = new File("src/fileInputStream.txt");
System.out.println("读状态:"+file.canRead());
System.out.println("写状态:"+file.canWrite());
System.out.println("执行状态:"+file.canExecute());
}
执行结果:
读状态: true
写状态: false
执行状态: true
②、文件类型的判断
File file = new File("src\\newfile.txt");
System.out.println("判断是否是一个 文件类型:"+file.isFile());
System.out.println("判断是否是一个 文件夹类型:"+file.isDirectory());
执行结果:
判断是否是一个 文件类型:true
判断是否是一个 文件夹类型:false
③、创建一个空白文件或者文件夹的方法
//创建一个空白文件
File file = new File("src\\newfile.txt");
file.createNewFile();
//创建一个空目录,前提是 src目录必须存在
File file = new File("src\\abc");
file.mkdir();
//递归创建目录,在这个例子中,abc和bcd为空目录
File file = new File("src\\abc\\bcd");
file.mkdirs();
4、删除文件的方法
File file = new File("src\\newfile.txt");
//调用方法,立即删除抽象路径描述的文件,无论有没有
file.delete();
//当虚拟机停止运行之前,才执行删除的操作
file.deleteOnExit();