FileSystem
阅读File源码之前,我们先了解下FileSystem.
Package-private abstract class for the local filesystem abstraction.
在linux环境下,它的实现类是UnixFileSystem;Windows环境下,它的实现类是WinNTFileSystem ;
File类在操作系统文件的时候,都是通过当前系统的FileSystem类来进行文件的操作.而FileSystem类对文件的操作一般都是调用本地方法来做的.
File
File源码需要关心的重点是
跨平台问题
跨平台的问题通过JDK的中FileSystem的实现类来规避,在linux版本的JDK中,FileSystem的实现类UnixFileSystem.Windows版本的JDK中,则是WinNTFileSystem.
文件的安全
这里以写文件为例:每次调用写文件的方法时,都需要先获取到当前系统的安全管理者,来判断当前文件是否有写权限;同理,其他所有对该文件的操作,都需要先判断当前文件是否有写权限或者读权限.
public boolean canWrite() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(path);
}
if (isInvalid()) {
return false;
}
return fs.checkAccess(this, FileSystem.ACCESS_WRITE);
}
文件的检索方法
File类对外提供了列举文件内部所有文件和文件夹的对象或者路径名称的方法.通过实现FilenameFilter,可以自定义文件的过滤规则.
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
- 基础的Api接口
构造器:
/**
* Internal constructor for already-normalized pathname strings.
*/
private File(String pathname, int prefixLength) {
this.path = pathname;
this.prefixLength = prefixLength;
}
private File(String child, File parent) {
assert parent.path != null;
assert (!parent.path.equals(""));
this.path = fs.resolve(parent.path, child);
this.prefixLength = parent.prefixLength;
}
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
- File实现了Comparable接口,内部实现比较的方式是通过UnixFileSystem的compare方法来比较两个文件的path
File:
public int compareTo(File pathname) {
return fs.compare(this, pathname);
}
UnixFileSystem:
/* -- Basic infrastructure -- */
public int compare(File f1, File f2) {
return f1.getPath().compareTo(f2.getPath());
}