图解 Java IO : 一、File源码
Writer :BYSocket(泥沙砖瓦浆木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket
记得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 | importjava.io.File;importjava.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 * 列出目录并排序 */publicclassDirListT {    publicstaticvoidmain(String[] args) {        // 获取当前目录        File path = newFile(".");// .表示当前目录        // 文件路径名数组        String list[] = path.list();                // 对String文件名进行排序        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);                // 打印        for(String dirItem : list)            System.out.println(dirItem);    }} | 
在eclipse中,右键run一下,可以得到如下的结果:

如图,很容易注意到了,其目录下的名字排序按字母并打印了。
先回顾下API知识吧,
首先构造函数 public File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新
File实例。如果给定字符串是空字符串,那么结果是空抽象路径名。
- 参数:
pathname– 路径名字符串- 抛出:
NullPointerException– 如果pathname参数为null
- 
二者,File实现了Comparator接口,以便对FileName进行排序。 
static Comparator<String>CASE_INSENSITIVE_ORDER
一个对String对象进行排序的 Comparator,作用与compareToIgnoreCase相同。
三者, path.list()为什么会返回String[] filenams的数组呢?怎么不是List呢?
自问自答:这时候,我们应该去看看ArrayList的实现,ArrayList其实是动态的数组实现。动态,动态的弊端就是效率低。此时,返回一个固定的数组,而不是一个灵活的类容器,因为其目录元素是固定的。下面是ArrayList和数组Array的比较:

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

1、static private FileSystem fs
FileSystem : 对本地文件系统的抽象
2、String path 文件路径名
3、内联枚举类
PathStatus 地址是否合法 ENUM类 private static enum PathStatus { INVALID, CHECKED };
4、prefixLength 前缀长度
- 
如下,给出File相关核心的UML图: 
其实操作的是 FileSystem : 对本地文件系统的抽象,真正操作的是 FileSytem的派生类。通过源码Ctrl+T发现如下:Win下操作的是 Win32FileSystem 和 WinNTFileSystem类。看来真正通过jvm,native调用系统的File是他们。

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

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

三、小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 | importjava.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方法详细使用 */publicclassFileMethodsT {        privatestaticvoidfileData(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(" 是一个文件");        elseif(f.isDirectory())            System.out.println(" 是一个目录");    }        publicstaticvoidmain(String[] args) {        // 获取src目录        File file = newFile("src");        // file详细操作        fileData(file);    }} | 
在eclipse中,右键run一下,可以得到如下的结果:大家应该都明白了吧。

文件如何过滤呢?
以后独立讲吧,过滤涉及Fiter类。
四、总结
1、看源码很简单,看数据结构。看如何调用。或者是有些设计模式
2、学东西,学一点一点深一点。太深不好,一点就够了
3、泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993
Writer :BYSocket(泥沙砖瓦浆木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket
图解 Java IO : 一、File源码的更多相关文章
- Java IO 之 OutputStream源码
		Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ... 
- Java IO 之 InputStream源码
		Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ... 
- 图解 Java IO : 二、FilenameFilter源码
		Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ... 
- JAVA上百实例源码以及开源项目
		简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ... 
- 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
		问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ... 
- 死磕 java集合之LinkedHashSet源码分析
		问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ... 
- JAVA上百实例源码网站
		JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ... 
- 死磕Java之聊聊HashSet源码(基于JDK1.8)
		HashSet的UML图 HashSet的成员变量及其含义 public class HashSet<E> extends AbstractSet<E> implements ... 
- IO系列测试源码
		//IO系列测试源码(需要自取) using System; using System.CodeDom; using System.Collections.Generic; using System. ... 
- Java集合---Array类源码解析
		Java集合---Array类源码解析 ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ... 
随机推荐
- HDU-6153    A Secret   扩展KMP
			题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ... 
- linux系统下部署DNS正向解析
			DNS服务概述: DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 正向解析 正向解析是指域名到IP 地址的解析过程. 部署DNS正向解析 DNS服务的三个配 ... 
- 实现PHP服务端和c#客户端数据交换
			服务端实现功能1,数据库的访问dbhelper.php包括执行语句返回多行,返回json数据,返回单条记录,返回第一行第一列的整数,返回第一行第一列的浮点数,返回第一行第一列的双精度数,返回第一行第一 ... 
- jQuery源码框架fn解读
			(function( window, undefined ){ var jQuery = (function(){ var jQuery = function( selector, context ) ... 
- 基于接口的 InvocationHandler 动态代理(换种写法)
			InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each p ... 
- 20145232韩文浩 《网络对抗技术》 Web基础
			Apache 因为端口号80已经被占用(上次实验设置的),所以先修改/etc/apache2/ports.conf里的端口为5232后重新开启 可以在浏览器中输入localhost:5208来检查是否 ... 
- Redlock:Redis分布式锁最牛逼的实现
			普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx.后一种方式的核心实现命令如下: - 获取锁(unique ... 
- C/C++中宏定义#pragma once与 #ifndef的区别
			为了避免同一个文件被include多次,我们可以通过以下两种方式来进行宏定义: 1. #ifndef方式2. #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两 ... 
- 程序员工作 996 生病 ICU ?
			阅读本文大概需要 2 分钟. 说实话,一般平时这个点我已经睡着了,今天准备好的文章也会准时在凌晨推送给大家.睡前看篇关于强制 996 加班的消息,里面有句口号还挺溜,上班996,下班ICU,为此还特意 ... 
- Python面向对象3:面向对象的三大特性
			面向对象的三大特性- 封装- 继承- 多态1 封装 - 封装就是对对象的成员进行访问限制- 封装的三个级别: - 公开,public - 受保护的,protected - 私有的,private - ... 
 
			
		