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

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

比如
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. Kubernetes 使用 ingress 配置 https 集群(十五)

    目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...

  2. SpringBoot系列教程JPA之新增记录使用姿势

    SpringBoot系列教程JPA之新增记录使用姿势 上一篇文章介绍了如何快速的搭建一个JPA的项目环境,并给出了一个简单的演示demo,接下来我们开始业务教程,也就是我们常说的CURD,接下来进入第 ...

  3. python 浅拷贝和深拷贝(9)

    何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~     一.普通的变量赋值 我们平常使用的变量赋值就是 ...

  4. DHCP配置实例(含DHCP中继代理)

    https://blog.51cto.com/yuanbin/109759. DHCP配置实例(含DHCP中继代理)   某公司局域网有192.168.1.0/24和192.168.2.0/24这两个 ...

  5. 总结IDEA和VS常用实用的快捷键

    整理了我一般撸码时使用下面两个IDE最常用到的快捷键: IntelliJ IDEA: 快捷搜索:Ctrl+F (Match Case:区分大小写,Words:全字匹配,Regex:正则匹配) 批量替换 ...

  6. Python开发之规范化目录

    13.规范化目录 规范目录优点: 可读性高 加载快 查询修改简 规范化目录结构 (1) start.py文件:首要配置启动文件,运行run()就可以执行项目 #start import sys imp ...

  7. flask框架(五)——支持正则写法、模板用法、请求响应、session

    如果用正则的话,我们要用自定义的路由. 1导入from werkzeug.routing import BaseConverter 2我先要写一个类,然后继承BaseConverter,然后实现__i ...

  8. pandas.DataFrame对象解析

    pandas.DataFrame对象类型解析 df = pd.DataFrame([[1,"2",3,4],[5,"6",7,8]],columns=[&quo ...

  9. Fully Convolutional Networks for Semantic Segmentation 译文

    Fully Convolutional Networks for Semantic Segmentation 译文 Abstract   Convolutional networks are powe ...

  10. Matrix Cells in Distance Order

    Matrix Cells in Distance Order We are given a matrix with R rows and C columns has cells with intege ...