java File详解
一、简介
File类是“文件”和“目录名”的抽象表示形式。因此在java语言中,File类既可以表示文件也可以表示目录。
尽管java.io定义的大多数类是实行流式操作的,而File类则不是,它没有指定信息怎样从文件读取或向文件存储。File描述了文件本身的属性,直接处理文件和文件系统,是唯一一个与文件本身有关的操作。
1.1 File的继承与实现接口
File 直接继承于Object,实现了Serializable接口和Comparable接口。
public class File implements Serializable, Comparable<File>
- File类实现Serializable接口,意味着File对象支持序列化操作。
- File类实现Comparable接口,意味着File对象之间可以比较大小,此外File能直接被存储在有序集合(如TreeSet、TreeMap中)。

1.2 File使用注意事项
1、创建File类对象时要注意的地方
1.3 File的常见方法
1)判断文件或者目录是否存在: exists()
2)判断是否为目录: isDirectory()
3)判断是否为文件: isFile()
4)判断文件是否可读: canRead()
5)判断文件是否可写: canWrite()
6)判断文件是否隐藏: isHidden()
7)判断文件路径是否为绝对路径: isAbsolute()
8)判断文件路径是否相同: equals():返回true,false
compareTo():是否相等,相等返回0,小于返回负数,大于返回正数
9)获取文件的绝对路径: getAbsolutePath()
10)获取文件名称: getName()
11)获取文件大小: length()
12)获取文件最后被修改的时间 : lastModified()
13)获取文件的路径: getPath()
14)获取文件的上层文件的目录: getParent()
15)创建一个新文件: createNewFile()
16)创建一个新目录: mkdir()
17)删除文件或目录: delete()
18)修改文件的名称: renameTo(str)
19)修改文件为只读: setReadOnly()
20)修改最后的修改时间: setLastModified(long time)
二、源码分析
2.1 成员变量
// The FileSystem object representing the platform's local file system.
// 获取本地文件系统
private static final FileSystem fs = DefaultFileSystem.getFileSystem(); // 文件路径名
private final String path; // 标记文件路径是否无效
private transient PathStatus status = null; // The length of this abstract pathname's prefix, or zero if it has no prefix.
private final transient int prefixLength; /**
* The system-dependent default name-separator character. This field is
* initialized to contain the first character of the value of the system
* property <code>file.separator</code>. On UNIX systems the value of this
* field is <code>'/'</code>; on Microsoft Windows systems it is <code>'\\'</code>.
*
*/
public static final char separatorChar = fs.getSeparator(); // The system-dependent path-separator character, represented as a string for convenience.
public static final String pathSeparator = "" + pathSeparatorChar;
那Linux呢?因此,下了个Linux版本的JDK,解压,找到rt.jar。然后java/io目录中,找到了UnixFileSystem类。真相大白了!

其实是根据不同的平台,安装不同版本的JDK,根据平台下对应版本的JDK,加载本地文件系统。
解决了fs这个成员变量,那么separatorChar 这个成员变量就迎刃而解了。
2.2 构造函数
1、首先看看整体如下:

public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
该构造方法主要是初始化了path、prefixLength两个成员变量,其中path通过WinNTFileSystem中normalize 公开方法将其规范化。
public static void main(String[] args)
{
File file = new File("d:/test.txt");
System.out.println(file.getPath());
}
File:
public String getPath() {
return path;
}
2)File(File parent, String child)
public File(File parent, String child) {
if (child == null) {
throw new NullPointerException();
}
if (parent != null) {
if (parent.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(),
fs.normalize(child));
} else {
this.path = fs.resolve(parent.path,
fs.normalize(child));
}
} else {
this.path = fs.normalize(child);
}
this.prefixLength = fs.prefixLength(this.path);
}
2.3 创建操作
- createNewFile
- createTempFile
- mkdir
1)createNewFile()
public boolean createNewFile() throws IOException {
// 1、检查是否有权限对该文件进行操作
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
// 2、检查文件路径是否有效
if (isInvalid()) {
throw new IOException("Invalid file path");
}
// 3、在Windows中,调用WinNTFileSystem中createFileExclusively方法,该方法是调用系统底层方法。
return fs.createFileExclusively(path);
}
// 此方法创建此抽象路径名的目录。
public boolean mkdir() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(path);
}
if (isInvalid()) {
return false;
}
return fs.createDirectory(this);
}
2.4 删除操作
- delete
- deleteOnExit
public boolean delete() {
// 1、权限检查
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkDelete(path);
}
// 2、检查文件路径是否有效
if (isInvalid()) {
return false;
}
// 3、调用系统本地底层删除方法,
// 不过在删除之前做了一些清理,cache.clear();prefixCache.clear();
return fs.delete(this);
}
2.5 获取文件操作
// Returns the absolute form of this abstract pathname. Equivalent to new File(this.getAbsolutePath()).
public File getAbsoluteFile() {
String absPath = getAbsolutePath();
return new File(absPath, fs.prefixLength(absPath));
}
// Returns the canonical form of this abstract pathname. Equivalent to new File(this.getCanonicalPath()).
public File getCanonicalFile() throws IOException {
String canonPath = getCanonicalPath();
return new File(canonPath, fs.prefixLength(canonPath));
}
// 此方法返回此抽象路径名的绝对路径名字符串。
public String getAbsolutePath() {
return fs.resolve(this);
}
// 此方法返回此抽象路径名的规范路径名字符串。
public String getCanonicalPath() throws IOException {
if (isInvalid()) {
throw new IOException("Invalid file path");
}
return fs.canonicalize(fs.resolve(this));
}
// 此方法此抽象路径名转换为一个路径名字符串。
// Converts this abstract pathname into a pathname string
// 此处pathname与File(String pathname)中pathname一致
public String getPath() {
return path;
}
4)getParent()
// 此方法返回此抽象路径名的父路径名的字符串,或者null,如果此路径名没有指定父目录。
public String getParent() {
// 查找最后分隔符的位置
int index = path.lastIndexOf(separatorChar);
if (index < prefixLength) {
if ((prefixLength > 0) && (path.length() > prefixLength))
return path.substring(0, prefixLength);
return null;
}
// 获取最后分隔符之前的所有字符
return path.substring(0, index);
}
java File详解的更多相关文章
- Java Annotation详解 理解和使用Annotation
系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...
- Java ClassLoad详解
Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...
- Java NIO 详解(一)
一.基本概念描述 1.1 I/O简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通 ...
- Java IO 详解
Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正, ...
- Java集合详解3:Iterator,fail-fast机制与比较器
Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
随机推荐
- innobackupex 单脚本循环7天一全备6增备脚本更新
#!/bin/bash #日期转为天数 function date2days { echo "$*" | awk '{ z=-$)/); y=$+-z; m=$+*z-; j=*m ...
- MFC 学习 之 状态栏的添加
1.首先声明一个 CStatusBar m_bar;//声明对象2.然后打开视图资源 String Table中添加两个字段值 3.创建了两个字段值以后,在OnintDialog() 所在的 .cp ...
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- AIR 程序开发系列 之五 保存数据的几种方式
Local SharedObject 这种方法比较简单方便的保存少的数据到到设备中.你不用自己去管理这些数据,设备会自动管理他. SharedObject 在 flash.net 包中,继承自Even ...
- careercup-中等难度 17.7
17.7 给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”). 解法: 举个例子,在转换19 323 984时,我们可以考虑分段处理 ...
- android中3种实现动画效果的方法
3中实现动画的方法:ImageView imgView = (ImageView)findViewById(R.id.imageView_logo); //第一种动画方法,使用AlphaAnimati ...
- mysql sql语句使用技巧
mysql更新数据限制limitmysql更新时,要更新记录中某个区间的数据,只能用WHERE条件来限制了,用LIMIT只能限制更新多少条!测试如下:UPDATE products SET goods ...
- MS OFFICE 2010破解版安装
受人所托发布一个MS OFFICE 2010破解版的傻瓜安装教程,刚好新本本也没有安装,安装过程中截了几个图就搞定了. 安装包: http://www.itopdog.cn/soft/office20 ...
- SVN服务器搭建和使用(二)
上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首先打开 ...
- 3D分析之Functional Surface工具箱(转)
来自:http://blog.csdn.net/kikitamoon/article/details/8195797 1. Add Surface Information(添加表面信息) 向点.线或面 ...