1.方法: new File(path);

我们知道根据输入的路径path的不同 ,File可以根据path的不同格式,来访问文件。那么,path的形式有几种呢?

根据源码

可以知道,输入的路径path其实是在类FileSystem中处理的。FileSystem是一个抽象类,所以,其实是在其实现类WinNTFileSystem中处理。

设定一个目标,我们要得到文件的绝对地址!

由如下代码

可以看出,我们是从WinNTFileSystem 的resolve得到绝对路径

@OverridepublicString resolve(File f) {

String path=f.getPath();int pl =f.getPrefixLength();if ((pl == 2) && (path.charAt(0) ==slash))return path; /*UNC*/

if (pl == 3)return path; /*Absolute local*/

if (pl == 0)return getUserPath() + slashify(path); /*Completely relative*/

if (pl == 1) { /*Drive-relative*/String up=getUserPath();

String ud=getDrive(up);if (ud != null) return ud +path;return up + path; /*User dir is a UNC path*/}if (pl == 2) { /*Directory-relative*/String up=getUserPath();

String ud=getDrive(up);if ((ud != null) &&path.startsWith(ud))return up + slashify(path.substring(2));char drive = path.charAt(0);

String dir=getDriveDirectory(drive);

String np;if (dir != null) {/*When resolving a directory-relative path that refers to a

drive other than the current drive, insist that the caller

have read permission on the result*/String p= drive + (':' + dir + slashify(path.substring(2)));

SecurityManager security=System.getSecurityManager();try{if (security != null) security.checkRead(p);

}catch(SecurityException x) {/*Don't disclose the drive's directory in the exception*/

throw new SecurityException("Cannot resolve path " +path);

}returnp;

}return drive + ":" + slashify(path.substring(2)); /*fake it*/}throw new InternalError("Unresolvable path: " +path);

}

我们需要两个参数,即String path = f.getPath();和int pl = f.getPrefixLength();

得到path

注意:windows 把"\\"当成"\"处理,即 "\\".length() ==1

@OverridepublicString normalize(String path) {int n =path.length();char slash = this.slash;char altSlash = this.altSlash;char prev = 0;for (int i = 0; i < n; i++) {char c =path.charAt(i);if (c ==altSlash) // 1:包含“/”return normalize(path, n, (prev == slash) ? i - 1: i);if ((c == slash) && (prev == slash) && (i > 1)) /:2:包含 "\",并且"\\",并且i>1return normalize(path, n, i - 1);if ((c == ':') && (i > 1)) //3:包含 ":",并且i>1return normalize(path, n, 0);

prev=c;

}if (prev == slash) return normalize(path, n, n - 1);returnpath; //4:若是绝对路径,则直接返回绝对路径

//5:"\\" 或 "\" 开头,直接返回

}

/*Normalize the given pathname, whose length is len, starting at the given

offset; everything before this offset is already normal.*/

private String normalize(String path, int len, intoff) {if (len == 0) returnpath;if (off < 3) off = 0; /*Avoid fencepost cases with UNC pathnames*/

intsrc;char slash = this.slash;

StringBuffer sb= newStringBuffer(len);if (off == 0) {/*Complete normalization, including prefix*/src=normalizePrefix(path, len, sb);

}else{/*Partial normalization*/src=off;

sb.append(path.substring(0, off));

}/*Remove redundant slashes from the remainder of the path, forcing all

slashes into the preferred slash*/

while (src

int sn =sb.length();if ((sn == 2) && (sb.charAt(1) == ':')) {/*"z:\\"*/sb.append(slash);break;

}if (sn == 0) {/*"\\"*/sb.append(slash);break;

}if ((sn == 1) && (isSlash(sb.charAt(0)))) {/*"\\\\" is not collapsed to "\\" because "\\\\" marks

the beginning of a UNC pathname. Even though it is

not, by itself, a valid UNC pathname, we leave it as

is in order to be consistent with the win32 APIs,

which treat this case as an invalid UNC pathname

rather than as an alias for the root directory of

the current drive.*/sb.append(slash);break;

}/*Path does not denote a root directory, so do not append

trailing slash*/

break;

}else{

sb.append(slash);

}

}else{

sb.append(c);

}

}

String rv=sb.toString();returnrv;

}

路径类型的分类:

@Overridepublic intprefixLength(String path) {char slash = this.slash;int n =path.length();if (n == 0) return 0;char c0 = path.charAt(0);char c1 = (n > 1) ? path.charAt(1) : 0;if (c0 ==slash) {if (c1 == slash) return 2; /*Absolute UNC pathname "\\\\foo"*/ UNC的绝对路径

return 1; /*Drive-relative "\\foo"*/ 与驱动盘相对路径}if (isLetter(c0) && (c1 == ':')) {if ((n > 2) && (path.charAt(2) ==slash))return 3; /*Absolute local pathname "z:\\foo"*/ 本地绝对路径

return 2; /*Directory-relative "z:foo"*/ 目录相对路径}return 0; /*Completely relative*/ 相对路径}

File(path)各种输入的path 及其 绝对路径

输入的path

/long

lo/ng

\/long

long/k

long

D:\JACK\OK

\\long(或者\long)

//long

this.path

\long

lo\ng

X非法输入

long\k

long

D:\JACK\OK

\long

\\long

this.PrefixLength

1

0

X

0

0

3

1

2

相关类型

盘相关

项目路径相关

项目路径相关

项目路径相关

完全绝对路径

盘相关

absolutePath

D:\long

D:\javaTest\long

X

D:\javaTest\long\k

D:\javaTest\long

D:\JACK\OK

D:\long

\\long

总结: 1:输入path 以'/' 或者 ’\\‘ 开头的 ,是以项目所在的硬盘位基础路径

2:输入path 以 字母开头 的,是以项目的路径为基础路径 即: System.getProperty("user.dir")

3.输入绝对路径的,就是以该绝对路径做为路径咯

java file源码_java File源码理解,探索File路径相关推荐

  1. java集合类程序代码_java集合类源码学习二

    我们查看Collection接口的hierarchy时候,可以看到AbstractCollection这样一个抽象类,它实现了Collection接口的部分方法,Collection集合系列的各个集合 ...

  2. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  3. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  4. java executor 源码_Java线程池ThreadPoolExecutor深度探索及源码解析

    我们的程序里,时常要使用多线程.因此多线程的管理变的尤为重要.ThreadPoolExecutor很好的解决了这一点.本篇文章主要从源码入手,分析ThreadPoolExecutor的原理. 1.标记 ...

  5. java数字取反_java中源码反码补码与取反的理解

    数字在计算机里是按照二进制来表示的. 箭头朝哪边就是朝哪边移动 补码,反码,和源码 负数原码转化为补码:符号位不变,数值位按位取反,末尾加一. 负数补码转化为原码:符号位不变,数值位按位取反,末尾加1 ...

  6. java ebcdic编码转换_JAVA实现ASCII码与EBCDIC码的相互转换

    import java.io.*; public class coder{ /** * ASCII码对应表 */ private static final String [] ASCII={ &quo ...

  7. java interrupt详解_Java线程源码解析之interrupt

    概述 Thread提供了interrupt方法,中断线程的执行: 如果线程堵塞在object.wait.Thread.join和Thread.sleep,将会抛出InterruptedExceptio ...

  8. java asc码_Java中ASC码与字符互相转化

    package com.ljq.test; /** * Java中ASC码与字符互相转化 * * @author jiqinlin * */ public class ASCTest { privat ...

  9. java 打印一维码_java生成一维码

    /** * * 一维码图片生成器 * @author winter.liu * */ public class OneBarcodeUtil { /** * 生成一维码 * @param value ...

  10. java中文乱码 例子_Java中文转码的例子,用来对付乱码

    public class HelloWorld { public static void main(String[] argv){ try{ System.out.println("中文&q ...

最新文章

  1. 英特尔王锐:软硬件并驾齐驱,开发者是真英雄
  2. day2:作业 购物车程序及升级版本
  3. Docker进阶-资源管理Swarm+Portainer
  4. SAP CRM Appointment应用里Date profile的配置
  5. qq浏览器网页翻译_iOS 14中直接在Safari浏览器中翻译网页的方法!
  6. Redis简单命令(部分示例代码)
  7. 鸿蒙系统-手机-HAP开发编译调试
  8. My sql 存储过程实例
  9. python web全栈工程师招聘_【笔记】Web全栈工程师的自我修养(上)
  10. 金蝶KIS应用虚拟化集成解决方案
  11. 计算机软件工程专业研究生大学排名,软件工程研究生院校排名
  12. 如何打开控制面板(windows10)
  13. 透明加密系统设计及实现-透明加密的关键技术
  14. UE4设置场景摄像机视角
  15. (收藏)让你从骨子里爱上英文
  16. xiunobbs装插件
  17. nginx、php-fpm以及mysql运行在各个用户下的配置
  18. 【图形处理】字模软件与汉字取模(GB2312、GBK,BIG5)(草稿)
  19. 尚学堂Java第五章所有题目
  20. pandas中DataFrame可视化之画多图的方法小结

热门文章

  1. c实现多语言编程,C/C++编程中多国语言处理
  2. css3 渐变色 3种,css3实现渐变色文字的三种方法
  3. 单个像素 亮度 HTML,YUV与像素值之间的关系
  4. 扫描文件夹_按下苹果手机这个键,立马变身成为扫描仪,你不会还不知道吧?...
  5. 方舟服务器维护公告11月19日,明日方舟11月19日10点停机维护 更新内容一览
  6. 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
  7. java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...
  8. 九十八、轻松搞定Python中的Markdown系列
  9. 六十三、SpringBoot中的日志框架SLF4j的使用
  10. 「AI在左,营销在右」互动营销创意破圈,这事儿不难