[二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介
第一个名称是 目录名,第一个名称之后每个名称表示一个目录,最后一个名称既可以是目录,也可以是名称
空 抽象路径名没有前缀和名称序列
|
构造方法
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 实例。 |
File file = new File("D:\\testFile");//file就是对这个路径的一个描述,那么是否真的存在? 你还需要进行去验证 |
名称与路径的分隔符
separatorChar public static final char separatorChar |
与系统有关的默认名称分隔符。
此字段被初始化为包含系统属性 file.separator 值的第一个字符。
在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
|
separator public static final String separator |
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。 |
pathSeparatorChar public static final char pathSeparatorChar |
与系统有关的路径分隔符。 此字段被初始为包含系统属性 path.separator 值的第一个字符。 此字符用于分隔以路径列表 形式给定的文件序列中的文件名。 在 UNIX 系统上,此字段为 ':';在 Microsoft Windows 系统上,它为 ';'。 |
pathSeparator public static final String pathSeparator |
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
此字符串只包含一个字符,即 pathSeparatorChar。
|
File API分类
文件自身属性读取 |
getName()
getParent()
getParentFile()
getPath()
isHidden()
lastModified()
length()
isAbsolute()
isDirectory()
isFile()
exists()
getAbsoluteFile()
getAbsolutePath()
getCanonicalFile()
getCanonicalPath()
getFreeSpace()
getTotalSpace()
getUsableSpace()
|
创建文件/目录基本操作
|
mkdir()
mkdirs()
delete()
deleteOnExit()
renameTo(File)
createTempFile(String, String)
createTempFile(String, String, File)
createNewFile()
|
文件/目录 列表读取 |
listRoots()
list()
list(FilenameFilter)
listFiles()
listFiles(FileFilter)
listFiles(FilenameFilter)
|
文件权限访问以及文件信息设置 |
canExecute()
canRead()
canWrite()
setExecutable(boolean)
setExecutable(boolean, boolean)
setReadable(boolean)
setReadable(boolean, boolean)
setReadOnly()
setWritable(boolean)
setWritable(boolean, boolean)
setLastModified(long)
|
其他 |
toPath()
toString()
toURI()
equals(Object)
compareTo(File)
hashCode()
|
File API详解
File相关的基础信息属性
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() | 将此抽象路径名转换为一个路径名字符串。 所得字符串使用 默认名称分隔符 分隔名称序列中的名称。 |
public boolean isHidden() | 是否隐藏文件 测试此抽象路径名指定的文件是否是一个隐藏文件。 隐藏 的具体定义与系统有关 |
public long lastModified()
|
long 毫秒数 表示文件最后一次被修改的时间的 long 值, 用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示; 如果该文件不存在,或者发生 I/O 错误,则返回 0L |
public long length() | 长度,字节 返回由此抽象路径名表示的文件的长度。 如果此路径名表示一个目录,则返回值是不确定的。 此抽象路径名表示的文件的长度,以字节为单位;
如果文件不存在,则返回 0L。
对于表示特定于系统的实体(比如设备或管道)的路径名,某些操作系统可能返回 0L。
|
public boolean isAbsolute() |
是否绝对路径
测试此抽象路径名是否为绝对路径名。绝对路径名的定义与系统有关。
在 UNIX 系统上,如果路径名的前缀是 "/",那么该路径名是绝对路径名。
在 Microsoft Windows 系统上,
如果路径名的前缀是后跟 "\\" 的盘符,或者是 "\\\\",那么该路径名是绝对路径名。
|
public boolean isDirectory() | 当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false |
public boolean isFile() | 当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false |
public boolean exists() | 当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false |
public String getAbsolutePath() | 绝对路径名字符串,它与此抽象路径名表示相同的文件或目录 |
public File getAbsoluteFile()
|
绝对 抽象路径名,它与此抽象路径名表示相同的文件或目录 相当于new File(this.getAbsolutePath())
|
public String getCanonicalPath()
throws IOException
|
规范路径名字符串,它与此抽象路径名表示相同的文件或目录
|
public File getCanonicalFile()
throws IOException
|
等同于 new File(this.getCanonicalPath()) |
public long getFreeSpace()
public long getTotalSpace()
public long getUsableSpace()
|
返回此抽象路径名指定的分区中空间相关的数据信息,一定注意是抽象路径名指定的分区 未分配 /全部/已使用 空间情况 单位是字节数 |
File相关的操作
mkdir()
|
创建此抽象路径名指定的目录,当且仅当已创建目录时,返回 true;否则返回 false |
mkdirs() | 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。 |
public boolean renameTo(File dest) | 重新命名此抽象路径名表示的文件。 参数为File 此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,
该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。
应该始终检查返回值,以确保重命名操作成功。
|
public boolean delete() | 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
当且仅当成功删除文件或目录时,返回 true;否则返回 false
|
public void deleteOnExit() |
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
文件(或目录)将以与注册相反的顺序删除。
调用此方法删除已注册为删除的文件或目录无效。
根据 Java 语言规范中的定义,只有在虚拟机正常终止时,才会尝试执行删除操作。
一旦请求了删除操作,就无法取消该请求。所以应小心使用此方法。
|
public static File createTempFile(String prefix,
String suffix,
File directory)
throws IOException
|
在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 如果 directory 参数为 null,则使用与系统有关的默认临时文件目录 默认临时文件目录由系统属性 java.io.tmpdir 指定 |
public static File createTempFile(String prefix,
String suffix)
throws IOException
|
在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 调用此方法等同于调用 createTempFile(prefix, suffix, null) |
public boolean createNewFile()
throws IOException
|
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 检查文件是否存在,若不存在则创建该文件 如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false |
File相关的列表查询
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,则接受所有路径名。 |
public static File[] listRoots() |
列出可用的文件系统根。
特定 Java 平台可以支持零个或更多个分层组织的文件系统。
每个文件系统有一个 root 目录,可以从这里到达文件系统中的所有其他文件。
例如,Windows 平台为每个活动驱动器提供了一个根目录;
UNIX 平台只有一个根目录,即 "/"。
可用文件系统根的设置受各种系统级操作的影响,比如可移动介质的插入和弹出,以及断开或卸载那些物理磁盘或虚拟磁盘。
此方法返回一个 File 对象数组,这些对象表示可用文件系统根的根目录。
可以保证本地机器上物理存在的任何文件的规范路径名都以此方法返回的根之一开始。
|
File相关权限设置
public boolean canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件。 |
public boolean canRead() | 测试应用程序是否可以读取此抽象路径名表示的文件。 |
public boolean canRead() | 测试应用程序是否可以修改此抽象路径名表示的文件。 |
setExecutable(boolean)
setExecutable(boolean, boolean)
|
设置此抽象路径名的所有者或所有用户的执行权限。
executable - 如果为 true,则设置允许执行操作的访问权限;如果为 false,则不允许执行操作。
ownerOnly - 如果为 true,则执行权限只适用于所有者的执行权限;否则适用于所有用户。
如果底层文件系统不能区分所有者执行权限与其他执行权限,那么无论该参数为何值,执行权限将适用于所有用户。
单参数版本是双参数版本的快捷默认设置形式
file.setExcutable(arg) 形式的调用与以下调用的行为完全相同:file.setExecutable(arg, true)
也就是单参数默认是设置当前用户
|
setReadable(boolean)
setReadable(boolean, boolean)
|
设置此抽象路径名的所有者或所有用户的读权限。
其余的用法形式同setExecutable |
setWritable(boolean)
setWritable(boolean, boolean)
|
设置此抽象路径名的所有者或所有用户的写权限。
其余的用法形式同setExecutable
|
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() {
return getPath();
}
|
public URI toURI() |
构造一个表示此抽象路径名的 file: URI。
该 URI 的具体形式与系统有关。如果可以确定此抽象路径名表示的文件是一个目录,那么所得 URI 将以斜杠结束。
对于某个给定抽象路径名 f,可保证:
new File( f.toURI()).equals( f.getAbsoluteFile())
|
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 的哈希码的异或。 在将路径名字符串转换为小写时不考虑语言环境。 |
FileSystem简介
FileSystem到底是什么?
属性
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();//用于缓存标准路径前缀
路径的标准化
我们给出了一个很奇怪的路径字符串 "D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java" File file = new File("D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java"); if (file.exists()){ System.out.println(file.getName()); } |
我们给出来了一个乱七八糟的路径,最终路径按照当前文件系统的规则,进行了解析,
去除了不必要的分隔符 或者可能把错误的分隔符进行替换等按照一定的规则
整理出来一个合理的路径,这就是标准化
|
还是刚才的文件夹列表 这次使用另外的构造方法 File file = new File("D:\\\\\\/testFile///////\\\\","\\///wdwqdwqwd.java"); if (file.exists()){ System.out.println(file.getName()); } 所以可以看得出来resolve做的事情
他要求传递进去的两个字符串都是normal的,所以入参传递进去时,就做了处理
虽然说两个都是normal但是两个拼接起来的情况还是很可能需要处理的,
比如子路径如果以 slash 开头,丢弃它的头部,所以子路径从第2的位置开始
双参数的resolve就是解决这个问题的
一个参数的resolve
public String resolve(File f)
也是类似的道理
只不过他处理的是一个File
|
getUserPath方法 通过 System 获取 user.dir 属性作为用户路径。
getDrive方法 获取驱动盘,先获取路径头部长度,再截取驱动盘。
|
driveIndex方法
获取驱动盘的索引值,按照字母顺序,比如 a 或 A 则索引值为0
|
getDriveDirectory方法
获取指定驱动盘下的工作目录,每个驱动盘都有工作目录。
先根据驱动盘获取对应的驱动盘索引
然后尝试从缓存中读取,如果读取得到直接返回
如果获取不到, 使用本地方法获取,然后在缓存起来
|
fromURIPath主要是完成了路径的格式化 看代码的注释,注释就是示例程序 |
关于路径相关的一些补充
绝对路径是一个广泛的概念,它表示的是可以唯一定位一个文件或文件夹的路径,
有多种形式的路径都属于绝对路径的范畴 比如,完整路径(Full path)
我们平时所说的“绝对路径”通常就是指完整路径,它的windows格式如下:
C:\Windows\System32\drivers\etc\hosts
|
UNC是网络(主要指局域网)中用于标志共享文件的路径
在windows下格式
\\servername\sharename\path\filename
包括计算机名/共享文件夹名/以及共享文件夹下的路径
|
相对路径都是以某一个路径为基础的 |
纯粹的相对路径
纯粹的相对路径格式如下:
Windows\System32\calc.exe 可以看得到,没有 斜杆 也没有盘符
相对的位置是,进程的当前文件夹
进程的当前文件夹并不是指EXE执行文件所在的文件夹
比如cmd控制台
cmd.exe程序的位置不会变,但是你可以切换当前文件夹的位置,切换过的位置就是当前文件夹
|
斜杠 开头的相对路径 斜杠开头的表示相对于当前文件夹的根路径,根据上面介绍的当前文件夹,然后确定他的根路径 比如当前是C:\Windows 根就是C 相对的就是C |
盘符开头的相对路径 calc计算器位于上面的路径,打开文件可以执行 |
linux的绝对路径是指从根目录说起的. 例如 /home/somedir/..
而相对路径则是从当前目录说起: 即 ./
|
有4个相对路径的表示方法:
当前目录 .
父目录 ..
某用户的根目录 ~user
自己的根目录 ~
|
[二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介的更多相关文章
- (原创)LAMP搭建之二:apache配置文件详解(中英文对照版)
LAMP搭建之二:apache配置文件详解(中英文对照版) # This is the main Apache server configuration file. It contains the # ...
- Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务
一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2 应用服务和数据服务拆分 特点:App.DB.Fi ...
- Linux core dump file详解
Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...
- Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream-->干什么事(具体怎么做,就交给Stream)--》聚合
Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...
- RocketMQ详解(二)安装使用详解
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
随机推荐
- Class 和 普通构造函数区别
1. Class 在语法上更加贴合面向对象的写法 2. Class在实现继承上更加易读.易理解 3. 更易于写java等后端语言 4.本质还是语法糖,使用prototype
- python练习题目
1.查看本机安装python版本 2.用python打印"Hello World",给出源代码和执行结果 a.命令行窗口输出(前提:python程序加入PATH系统环境变量) b. ...
- Vue(二十九)页面加载过慢问题
1.使用按需加载 2.路由懒加载
- h5适配的解决方案
一. 流程 设计师以750pt×1334pt尺寸进行设计(当然高度随内容变化),最后用该尺寸的设计稿进行标注.切图,前端采用淘宝的开源方案flexible进行适配. 二. flexible使用方法 F ...
- Java_循环
遍历数组: 一个栗子: public class Test01 { public static void main(String[] args) { int[] aa = {19,92,12,03,4 ...
- Redmine 安装、搭建
参考两个博客: 1.https://blog.csdn.net/g19881118/article/details/59476045 2.https://www.cnblogs.com/chendal ...
- SharePoint 更改管理帐户密码步骤
// https://wenku.baidu.com/view/0fffab761ed9ad51f01df2df.html \
- 高德Location
1.创建Demo,获取key 打开高德开发平台 → 我的应用 → 创建应用 → 创建新Key 说明: 1.发布版安全码获取:用自己的签名打包成apk安装软件,用SHA1工具查看 2.调试版安全码获取: ...
- 【.NET Core微服务实战-统一身份认证】开篇及目录索引
简介 学习.NETCORE也有1年多时间了,发现.NETCORE项目实战系列教程很少,都是介绍开源项目或基础教程,对于那些观望的朋友不能形成很好的学习思路,遇到问题怕无法得到解决而不敢再实际项目中 ...
- java byte 梳理
最近写编解码的代码比较多,抽一点时间梳理下java下byte的解析.在例子代码中主要涉及的知识点就两块: 1.byte代表8个bit,其中最高位是符号位: 2.当我们用String类的getBytes ...