java file源码_图解 Java IO : 一、File源码

记得Java源码是集合开始看的,写了一系列集合相关的文章,受到不错的评价。感谢各位读者。我依旧会读到老写到老,并生动形象的写出来心得体会。这次依旧是图解,我研究IO这块。

Java IO – File的要点,应该是

1、跨平台问题的解决

2、文件的安全

3、文件的检索方法

一、代码小引入

代请看一个简单的小demo:(ps:开源项目java-core-learning地址:https://github.com/JeffLi1993)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

import java.io.File;

import java.util.Arrays;

/*

* Copyright [2015] [Jeff Lee]

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

/**

* @author Jeff Lee

* @since 2015-7-13 07:58:56

* 列出目录并排序

*/

public class DirListT {

public static void main(String[] args) {

// 获取当前目录

File path =new File(".");// .表示当前目录

// 文件路径名数组

String list[] = path.list();

// 对String文件名进行排序

Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);

// 打印

for(String dirItem : list)

System.out.println(dirItem);

}

}

在eclipse中,右键run一下,可以得到如下的结果:

d92ca77868bd66e6f46011c3c01f66e3.png

如图,很容易注意到了,其目录下的名字排序按字母并打印了。

先回顾下API知识吧,

首先构造函数 public File(String pathname)

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,那么结果是空抽象路径名。

参数:

pathname – 路径名字符串

抛出:

二者,File实现了Comparator接口,以便对FileName进行排序。

String 对象进行排序的 Comparator,作用与 compareToIgnoreCase 相同。

三者, path.list()为什么会返回String[] filenams的数组呢?怎么不是List呢?

自问自答:这时候,我们应该去看看ArrayList的实现,ArrayList其实是动态的数组实现。动态,动态的弊端就是效率低。此时,返回一个固定的数组,而不是一个灵活的类容器,因为其目录元素是固定的。下面是ArrayList和数组Array的比较:

2264fcf7ee5ac099cc76453d203d05cc.png

二、深入理解源码

File,File究竟是怎么构成的。顺着源码,知道了File有几个重要的属性:

67d0619c04f9ead86270f93ea856c2cf.png

1、static private FileSystem fs

FileSystem : 对本地文件系统的抽象

2、String path 文件路径名

3、内联枚举类

PathStatus 地址是否合法 ENUM类 private static enum PathStatus { INVALID, CHECKED };

4、prefixLength 前缀长度

如下,给出File相关核心的UML图:

2db2490511ba34ff1666d8fdb361b5a2.png

其实操作的是 FileSystem : 对本地文件系统的抽象,真正操作的是 FileSytem的派生类。通过源码Ctrl+T发现如下:Win下操作的是 Win32FileSystem 和 WinNTFileSystem类。看来真正通过jvm,native调用系统的File是他们。

2c0d30faf21536d1adcd502790fc1100.png

那Linux呢?因此,下了个Linux版本的JDK,解压,找到rt.jar。然后java/io目录中,找到了UnixFileSystem类。真相大白了!

df4fb2a959ad9b47f9e0888cf583b548.png

所以可以小结File操作源码这样调用的:中间不同JDK,其实是不同的类调用本机native方法。

0d41f570388e04b3e69fb12d48f7854f.png

三、小demo再来一发

File 其实和我们在系统中看的的文件一样。就像我们右键,属性。可以看到很多File的信息。Java File也有。下面是一个文件的相关方法详情:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

import java.io.File;

/*

* Copyright [2015] [Jeff Lee]

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

/**

* @author Jeff Lee

* @since 2015-7-13 10:06:28

* File方法详细使用

*/

public class FileMethodsT {

private static void fileData(File f) {

System.out.println(

" 绝对路径:" + f.getAbsolutePath() +

"\n 可读:" + f.canRead() +

"\n 可写:" + f.canWrite() +

"\n 文件名:" + f.getName() +

"\n 上级目录:" + f.getParent() +

"\n 相对地址:" + f.getPath() +

"\n 长度:" + f.length() +

"\n 最近修改时间:" + f.lastModified()

);

if(f.isFile())

System.out.println(" 是一个文件");

else if(f.isDirectory())

System.out.println(" 是一个目录");

}

public static void main(String[] args) {

// 获取src目录

File file =new File("src");

// file详细操作

fileData(file);

}

}

在eclipse中,右键run一下,可以得到如下的结果:大家应该都明白了吧。

86c4d8730b450bda8c2a812c47f15b20.png

文件如何过滤呢?

以后独立讲吧,过滤涉及Filter类。

四、总结

1、看源码很简单,看数据结构。看如何调用。或者是有些设计模式

2、学东西,学一点一点深一点。太深不好,一点就够了

3、泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值