zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介编程语言

编程语言 详解 简介 以及 File JavaIO filesystem
2023-06-13 09:20:45 时间
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
URI是统一资源标识符,将文件转换成一个链接,可以网络访问 ,通过这个URI 也可以用来生成文件
new File只是在java中描述这么一个文件,是否真的存在? 你还需要进行去验证,只是一个虚拟的描述符
File file = new File( D://testFile );//file就是对这个路径的一个描述,那么是否真的存在? 你还需要进行去验证
separator
public static final String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
pathSeparatorChar
public static final char pathSeparatorChar 与系统有关的路径分隔符。
此字段被初始为包含系统属性 path.separator 值的第一个字符。
此字符用于分隔以路径列表 形式给定的文件序列中的文件名。
在 UNIX 系统上,此字段为 : ;在  Microsoft Windows 系统上,它为 。
public String getName() 返回由此抽象路径名表示的文件或目录的名称。
该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。
测试信息: getName():  cccc.txt
public String getParent() 返回此抽象路径名父目录的路径名字符串;
如果此路径名没有指定父目录,则返回 null。
getParent():  D:/testFile
public File getParentFile() public String getParent() 的File形式,等同于new File(getParent())
public String getPath() 将此抽象路径名转换为一个路径名字符串。
所得字符串使用  默认名称分隔符  分隔名称序列中的名称。 
这个抽象路径名(File) 的父 parent为  路径名名称序列中的除了最后一个名称以外的所有 
这个抽象路径名(File) 的路径path为  路径名名称序列中所有的名称,只不过使用默认的的名称分隔符分割
public boolean isHidden() 是否隐藏文件
测试此抽象路径名指定的文件是否是一个隐藏文件。
隐藏 的具体定义与系统有关
long 毫秒数
表示文件最后一次被修改的时间的 long 值,
用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示;
如果该文件不存在,或者发生 I/O 错误,则返回 0L
public long length() 长度,字节
返回由此抽象路径名表示的文件的长度。
如果此路径名表示一个目录,则返回值是不确定的。

此抽象路径名表示的文件的长度,以字节为单位;
public boolean isDirectory() 当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false 
public boolean isFile() 当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false
public boolean exists() 当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false 
public String getAbsolutePath() 绝对路径名字符串,它与此抽象路径名表示相同的文件或目录
绝对  抽象路径名,它与此抽象路径名表示相同的文件或目录  相当于new File(this.getAbsolutePath())
如有必要,此方法首先将路径名转换为绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。
这通常涉及到从路径名中移除多余的名称(比如 . 和 .. )、解析符号连接(对于 UNIX 平台),以及将驱动器号转换为标准大小写形式(对于 Microsoft Windows 平台)。
同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。
返回此抽象路径名指定的分区中空间相关的数据信息,一定注意是抽象路径名指定的分区
未分配 /全部/已使用  空间情况
单位是字节数
mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。 
mkdir只会创建最后一个名称为名称的目录,  如果一个路径的parent不存在,并不会创建成功
此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,
该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。
public boolean delete() 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。

当且仅当成功删除文件或目录时,返回 true;否则返回 false 
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
如果 directory 参数为 null,则使用与系统有关的默认临时文件目录
默认临时文件目录由系统属性 java.io.tmpdir 指定
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
调用此方法等同于调用 createTempFile(prefix, suffix, null)
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
检查文件是否存在,若不存在则创建该文件
如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false
public String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

如果此抽象路径名不表示一个目录,那么此方法将返回 null。
表示目录本身及其父目录的名称不包括在结果中。每个字符串是一个文件名,而不是一条完整路径。
public String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。
如果给定 filter 为 null,则接受所有名称。
public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
如果此抽象路径名不表示一个目录,那么此方法将返回 null。
否则返回一个 File 对象数组,每个数组元素对应目录中的每个文件或目录。
表示目录本身及其父目录的名称不包括在结果中。
不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
public File[] listFiles(FilenameFilter filter) 除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同
如果给定 filter 为 null,则接受所有路径名
public File[] listFiles(FileFilter filter) 除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。
如果给定 filter 为 null,则接受所有路径名。
可用文件系统根的设置受各种系统级操作的影响,比如可移动介质的插入和弹出,以及断开或卸载那些物理磁盘或虚拟磁盘。
对函数式接口不熟悉的可以翻阅之前关于java8的文章,当然你也可以匿名内部类或者实现它,显然lambda表达式是最方便的
executable 如果为 true,则设置允许执行操作的访问权限;如果为 false,则不允许执行操作。
如果底层文件系统不能区分所有者执行权限与其他执行权限,那么无论该参数为何值,执行权限将适用于所有用户。
file.setExcutable(arg) 形式的调用与以下调用的行为完全相同:file.setExecutable(arg, true) 
设置此抽象路径名的所有者或所有用户的读权限。

其余的用法形式同setExecutable setWritable(boolean) setWritable(boolean, boolean) 设置此抽象路径名的所有者或所有用户的写权限。   其余的用法形式同setExecutable setExecutable/setReadable/setWritable 用于设置 执行  读  写 权限 双参数版本  第一个参数表示是否允许,第二个参数表示是否是用于所有的用户 一个参数版本是两个参数版本的当前用户的简化快捷形式 public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 调用此方法后,可以保证在被删除或被标记为允许写访问之前,文件或目录不会发生更改。 是否可以删除某个只读文件或目录则取决于底层系统。

public boolean setLastModified(long time) 设置此抽象路径名指定的文件或目录的最后一次修改时间。 其他public Path toPath() 返回一个java.nio.file.Path  从这个抽象路径构造的Path对象
1.7新增的 public String toString() 返回此抽象路径名的路径名字符串。该字符串就是 getPath() 方法返回的字符串。

  public String toString() {
该 URI 的具体形式与系统有关。如果可以确定此抽象路径名表示的文件是一个目录,那么所得 URI 将以斜杠结束。
public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。此方法定义的顺序取决于底层系统。
在 UNIX 系统上,比较路径名时,字母大小写通常很重要,而在 Microsoft Windows 系统上,这通常不重要。
依赖
public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。
当且仅当该参数不是 null,而是一个与此抽象路径名表示相同的文件或目录的抽象路径名时,返回 true。
两个抽象路径名是否相等取决于底层系统。
在 UNIX 系统上,比较路径名时,字母大小写通常很重要,而在 Microsoft Windows 系统上,这通常不重要。 
public int hashCode() 计算此抽象路径名的哈希码。
因为抽象路径名的相等性与系统有关,所以对其哈希码的计算也与系统有关。
在 UNIX 系统上,抽象路径名的哈希码等于其路径名字符串和十进制值 1234321 的哈希码的异或。
在 Microsoft Windows 系统上,哈希码等于其转换为小写的路径名字符串和十进制值 1234321 的哈希码的异或。
在将路径名字符串转换为小写时不考虑语言环境。 
操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。
你只能在 Windows 版本的 JDK 中找到 WinNTFileSystem,而在 Linux 版本的 JDK 中找到 UnixFileSystem
private final char slash;//斜杠符号 

private final char altSlash;//与slash相反的斜杠 

private final char semicolon;//分号 

private static String[] driveDirCache = new String[26];//表示驱动盘目录缓存 

private ExpiringCache cache = new ExpiringCache();//用于缓存标准路径 

private ExpiringCache prefixCache = new ExpiringCache();//用于缓存标准路径前缀

不光标准化,前面还提到了规范化路径 File中有方法getCanonicalFile  getCanonicalPath

image_5b9396ec_7ea4   虽然看起来很奇怪,但是不影响程序运行 我们此时可以用比较通俗的话来描述这个情况 我们给出来了一个乱七八糟的路径,最终路径按照当前文件系统的规则,进行了解析, 去除了不必要的分隔符 或者可能把错误的分隔符进行替换等按照一定的规则 整理出来一个合理的路径,这就是标准化   debug 看下File的构造方法  就知道了 最终他帮我们正确的解析了路径,这就是标准化 image_5b9396ec_5748   可以看得出来,标准化,借助的仍旧是fs  也就是FileSystem   在WinNTFileSystem 中的normalize方法就是标准化路径的一个对外接口 他还有两个相关的private方法,用于处理细节 方法的具体过程,到底是怎么处理的,有兴趣的同学可以继续深挖以下 仔细看下注释也可理解一二 一个标准的win32路径名,不能包括重复的名称分隔符(斜杠) UNC除外 ,也不能以名称分隔符(斜杠)结束 可能是一个空的String 规范化Win32路径名具有便捷的特点:前缀的长度几乎唯一地标识了路径的类型 无论它是绝对的还是相对的 0,1,2,3是分类说明 image_5b9396ec_945   如同上面标准化描述的一样,前缀的长度对于标准化很有用,这个方法经常被使用 image_5b9396ec_4300    还是刚才的文件夹列表
这次使用另外的构造方法

 

File file = new File("D:///////testFile///////////","/////wdwqdwqwd.java"); 

if (file.exists()){ 

System.out.println(file.getName()); 

}

 

image_5b9396ec_5b48
5. 如果长度为1,则为驱动盘相对路径,此时尝试根据用户路径获取驱动盘,存在驱动盘则返回驱动盘+此路径
  此时先获取用户路径,再根据用户路径获取对应驱动盘,如果路径以驱动盘开头,则直接返回用户路径+去掉驱动盘后的路径。
  将驱动盘+:+工作目录+路径等拼接起来得到最终的新路径,然后还要用安全管理器检查是否有读的权限
所谓标准化就是适配这种格式,就好像学生时代让穿校服一样,那你到了这个学校就换上这个学校的校服,没什么好奇怪的
所以不要在你的代码中写死某种分隔符,而是使用File给我们提供的哪几个public static final定义的分隔符
斜杠 开头的相对路径
斜杠开头的表示相对于当前文件夹的根路径,根据上面介绍的当前文件夹,然后确定他的根路径
比如当前是C:/Windows  根就是C  相对的就是C

盘符开头的相对路径
C:System32/calc.exe 看起来跟完整路径类似,但是冒号:  后面却没有斜杠
这也是一种相对路径
表示的是进程在该分区上的当前文件夹
进程会保留在每个分区上的当前文件夹,比如你从 C盘 跳到了D盘,你的当前文件夹变化了
但是你在C盘最后一次的当前文件夹不在变动了,这就是  分区上的当前文件夹
image_5b9396ed_7e20

calc计算器位于上面的路径,打开文件可以执行
切换到别的分区
当你再次切换到C盘的时候,直接就回到了上一次的文件路径,这就是分区的当前文件夹