文件和目录路径名的抽象表示形式。

我们知道,对于不同的操作系统,文件路径的描述是不同的

比如
windows平台:用\
linux平台:用/ 
 
四个构造方法
 
API:
文件自身属性读取 
创建文件/目录基本操作  
文件/目录 列表读取

 文件权限访问以及文件信息设置 
其他
 

FileSystem简介

 
File中有一个变量fs  类型为FileSystem
compareTo方法依赖于他
而equals方法又依赖compareTo
hashCode也是依赖他
所以说:
compareTo   equals   hashCode   都依赖于 FileSystem fs
 
其实你在回头看看整个File文件中,很多个地方都出现了fs的身影

FileSystem到底是什么?

操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。
说白了又是接口来实现统一,不同的操作系统实现这个接口,就可以提供统一的表现形式
 
FileSystem是一个抽象类
windows下的实现类为:WinNTFileSystem,在IDE中可以直接找到
 
可能你只是找到了一个WinNTFileSystem,只有一个要接口还有什么意思?
如果你目前只看到了一个WinNTFileSystem  那说明你在Windows下
WinNTFileSystem类 和 UnixFileSystem类并不是在同一个 JDK 里面,也就是说它们是分开的
你只能在 Windows 版本的 JDK 中找到 WinNTFileSystem,而在 Linux 版本的 JDK 中找到 UnixFileSystem
同样地,其他操作系统也有自己的文件系统实现类。
接下来大致的看下WinNTFileSystem

属性

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();//用于缓存标准路径前缀
其实slash就是名称分隔符
semicolon就是路径分隔符
构造方法中根据系统变量对文件分隔符和路径分隔符进行初始化
 
isSlash  和 isLetter都非常简单,简单的判断
 
判断是否以slash  开头,是的话直接返回,不是的话,给他加一个
 
getSeparator  和 getPathSeparator  就是File中分隔符的来处
 

路径的标准化

不光标准化,前面还提到了规范化路径 File中有方法getCanonicalFile  getCanonicalPath
他们到底都是在说什么事情呢
 
先说下标准化,看一个例子
我们给出了一个很奇怪的路径字符串
"D://////\\\\\\/testFile\\\\///////\\wdwqdwqwd.java"

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

if (file.exists()){

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

}

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

源码解读之File的更多相关文章

  1. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  2. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

    这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...

  3. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...

  4. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  5. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  6. Alamofire源码解读系列(八)之安全策略(ServerTrustPolicy)

    本篇主要讲解Alamofire中安全验证代码 前言 作为开发人员,理解HTTPS的原理和应用算是一项基本技能.HTTPS目前来说是非常安全的,但仍然有大量的公司还在使用HTTP.其实HTTPS也并不是 ...

  7. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  8. Alamofire源码解读系列(十一)之多表单(MultipartFormData)

    本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...

  9. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

随机推荐

  1. [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  2. [LeetCode] 805. Split Array With Same Average 用相同均值拆分数组

    In a given integer array A, we must move every element of A to either list B or list C. (B and C ini ...

  3. 如何杀死处于进程状态D的进程

    D状态的就是 uninterruptible sleep ,此时进程不能被信号唤醒,GDB等调试工具也不能对它调试,因为GDB也是用到了信号,也杀不死它 D状态的形成 如何分析D状态 cat /pro ...

  4. radio和checkbox的js勾选使用

    Html: <table> <tr><th class="w1">党内职务</th><td colspan="3&q ...

  5. appium 弹窗处理

    测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...

  6. pip修改成国内镜像源

    临时指定镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple seaborn 永久修改镜像源 linux下,修改 ~/.pip/pip ...

  7. 【转帖】处理器史话 | 当Power架构的发展之路遭遇“滑铁卢”

    处理器史话 | 当Power架构的发展之路遭遇“滑铁卢” https://www.eefocus.com/mcu-dsp/366740 (8)Power8:决定了 Power 平台的未来发展 2014 ...

  8. python网课自动刷课程序-------selenium+chromedriver

    python的强大之处就在于有许多已经写好的功能库提供,这些库强大且易用,对于写一些有特定功能的小程序十分方便. 现在就用pyhton的selenium+谷歌游览器写一个可以自动刷课的程序,以智慧树上 ...

  9. Linux 总结篇

    1. sudo -i update upgrade install 包名 (openjdk-8-jdk) autoremove 自动删除不需要的包(remove卸载) sudo apt-get 2. ...

  10. Markdown新手入门

    目录 Markdown新手入门 一.字体样式 二. 标题 三.列表 四.引用和代码块 五.插入图片和超链接 六.创建表格 七. 上标和下标 八.着重显示和高亮显示 我是尾巴 Markdown新手入门 ...