图解 Java IO : 一、File源码

Writer      :李强强

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

Java IO – File的要点,应该是

1、跨平台问题的解决

2、文件的安全

3、文件的检索方法

一、代码小引入

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

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
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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一下,可以得到如下的结果:

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

先回顾下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下操作的是 Win32FileSystemWinNTFileSystem类。看来真正通过jvm,native调用系统的File是他们。

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

 

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

三、小demo再来一发

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

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
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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一下,可以得到如下的结果:大家应该都明白了吧。

文件如何过滤呢?

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

四、总结

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

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

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

时间: 2024-11-01 20:02:30

图解 Java IO : 一、File源码的相关文章

Java IO 之 OutputStream源码

Writer      :李强强   一.前言 上一篇<Java IO 之 InputStream源码>,说了InputStream.JDK1.0中就有了这传统的IO字节流,也就是 InputStream 和 OutputStream.梳理下两者的核心: InputStream中有几个 read() 方法和 OutputStream中有几个 write() 方法.它们是一一对应的,而核心的是read()和write()方法.它们都没实现,所有本质调用是各自实现类实现的该两个方法. read()

Java IO 之 InputStream源码

一.InputStream InputStream是一个抽象类,即表示所有字节输入流实现类的基类.它的作用就是抽象地表示所有从不同数据源产生输入的类,例如常见的FileInputStream.FilterInputStream等.那些数据源呢?比如: 1) 字节数组(不代表String类,但可以转换) 2) String对象 3) 文件 4) 一个其他种类的流组成的序列化 (在分布式系统中常见) 5) 管道(多线程环境中的数据源) 等等 二者,注意它是属于字节流部分,而不是字符流(java.io

Java IO 之 InputStream源码(2)

Writer:李强强 一.InputStream InputStream是一个抽象类,即表示所有字节输入流实现类的基类.它的作用就是抽象地表示所有从不同数据源产生输入的类,例如常见的FileInputStream.FilterInputStream等.那些数据源呢?比如: 1) 字节数组(不代表String类,但可以转换) 2) String对象 3) 文件 4) 一个其他种类的流组成的序列化 (在分布式系统中常见) 5) 管道(多线程环境中的数据源) 等等 二者,注意它是属于字节流部分,而不是

Java+Mysql学生管理系统源码_java

最近正在学java和数据库,想起以前写的学生管理系统,都是从网上下载,敷衍了事.闲来无事,也就自己写了一个,不过功能实现的不是很多.  开发语言:java: 开发环境:Mysql, java: 开发工具:eclipse 开发此案例,首先得在电脑上有java开发环境和Mysql, java开发环境与Mysql的搭建,就不再叙述了,如果需要,请联系我最下面的联系方式:dingyelf@aliyun.com  此次系统比较简易:数据库中只有一个表:stu;功能:能够对学生增加.删除.修改.开发步骤: 

服务器-Java编写ATM项目源码。

问题描述 Java编写ATM项目源码. 急需一个Java编写的银行ATM项目源码:要求:(1)客户端服务器模式 (2)实现基本的开户,存款,取款等功能(少一两个或多一两个都可) (3)支持多用户(越多越好)登录(4)服务器调用数据库存储开户数据等数据或使用文件存储均可,(5)通信方式采用Socket:还有就是纯Java编写,不可掺杂其他语言(没办法,老师要求的) 事关期末考试成绩,求不挂科,谢谢再谢谢了,有源码的请发扣扣972281410,谢谢 解决方案 这里有几个现成的,参考下http://d

datasource 连接池-java中dataSource的源码如何体现连接池?

问题描述 java中dataSource的源码如何体现连接池? 之前看了一些讲dataSource和连接池的博客,其中有一篇博客说连接池是dataSource的一个内置对象,于是我很好奇地去看了一下源码,发现DataSource接口里面只有两个getConnecttion()方法,我很好奇,大家所说的连接池的源码到底在哪?还有连接池真的是DataSource的内置对象吗? 解决方案 你要找到他的实现类啊,, 解决方案二: 数据库的连接池你可以上网上搜一点视频,有很多的学习资料

图解 Java IO : 二、FilenameFilter源码

更具体地说,这是一个策略模式的例子,因为list()实现了基本功能,而按着形式提供了这个策略,完善list()提供服务所需的算法. java.io.FilenameFilter是文件名过滤器接口,即过滤出符合规则的文件名组. 一.FilenameFilter源码 从IO的UML可以看出,FilenameFilter接口独立,而且没有它的实现类.下面就看看它的源码: public interface FilenameFilter { /** * 测试指定文件是否应该包含在某一文件列表中. * *

使用 Java 6 API分析源码

您可曾想过像 Checkstyle 或 FindBugs 这样的工具如何执行静态代码分析吗,或者像 NetBeans 或 Eclipse 这样的集成开发环境(Integrated Development Environments IDE)如何执行快速代码修复或 查找在代码中声明的字段的完全引用吗?在许多情况下,IDE 具有自己的 API 来解析源码并生成标准树 结构,称为 抽象语法树(Abstract Syntax Tree AST) 或"解析树",此树可用于对源码元素的进一步 分析.

java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

1. File类 File 路径问题: 上下级文件夹之间使用分隔符分开: 在Windows中分隔符为'\' ,在Unix/Linux中分隔符为'/' 跨平台分隔符: 专业的做法是使用File.separatorChar,这个值会根据系统得到的相应的分隔符. 例:new File("c:"+File.separatorChar+"a.txt"); 注意,如果是使用"\" ,则需要进行转义,写为"\\"才可以     绝对路径与相