1.构造函数
最基本的构造方法。
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
//将文件路径转为正常状态
this.path = fs.normalize(pathname);
//计算长度的路径字符串前缀,字符串必须是在正常的格式。
this.prefixLength = fs.prefixLength(this.path);
}
里面用到下面三个变量
//本地文件系统
static private FileSystem fs = FileSystem.getFileSystem();
//文件路径
private String path;
//路径长度
private transient int prefixLength;
另外有两个私有的构造函数+两个公有构造函数,里面只有对path和prefixLength复制的操作。
//里面操作都一样,就是给两个变量赋值。
public File(File parent, String child)
public File(String parent, String child)
//前面的child为路径,后面的为文件
private File(String child, File parent)
//路径+路径长度
private File(String pathname, int prefixLength)
以网络路径赋值的构造方法,目前我还不会用这个。似乎是file://192.168.1.201/wan/a.txt 这样的链接。
public File(URI uri) ;
2.createNewFile创建文件
/*SecurityManager 为安全管理器是一个允许应用程序实现安全策略的类。,权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化*/
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
//检查路径是否有写的权限。
if (security != null) security.checkWrite(path);
//创建文件,内部方法是native的
return fs.createFileExclusively(path);
}
//下面是SecurityManager类中的方法。内部方法很复杂,看不懂。只知道是检查文件能不能写的功能。
public void checkWrite(String file) {
checkPermission(new FilePermission(file,
SecurityConstants.FILE_WRITE_ACTION));
}
3.isDirectory和isFile
如果文件或者文件夹不存在的话这两个方法都返回false
//路径名表示的文件是否是一个目录
public boolean isDirectory() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
//看这个路径是否有读权限
security.checkRead(path);
}
//里面没内容,这里为什么只用一个&符号?
return ((fs.getBooleanAttributes(this) & FileSystem.BA_DIRECTORY)
!= 0);
}
//路径名表示的文件是否是一个标准文件。
public boolean isFile() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_REGULAR) != 0);
}
4.mkdir和mkdirs 创建目录
//只创建一个目录,如果多级目录都不存在就失败
public boolean mkdir() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(path);
}
//如果文件已经存在或者创建权限不够,返回false
return fs.createDirectory(this);
}
//创建多级目录
public boolean mkdirs() {
if (exists()) {
return false;
}
if (mkdir()) {
return true;
}
File canonFile = null;
try {
canonFile = getCanonicalFile();
} catch (IOException e) {
return false;
}
File parent = canonFile.getParentFile();
return (parent != null && (parent.mkdirs() || parent.exists()) &&
canonFile.mkdir());
}
看到这里已经觉得没意思了,里面的内容都看不了,都是抽象和native。
5.list和listFiles
这两个方法都是先判断有没有读权限,然后一个native方法结束。下面是使用
public static void main(String args[]) throws IOException {
File f = new File("src");
//这里返回的是文件数组
File[] l = f.listFiles();
for (int i = 0; i < l.length; i++) {
System.out.println(l[i].getName());
}
//这里返回的是文件名字符串数组
String[] s = f.list();
for (int i = 0; i < s.length; i++) {
System.out.println(s[i]);
}
}
这个是过滤器,实现FilenameFilter接口的accept方法。
一个例子,过滤文件名以.java结尾的文件
String[] names =f.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".java")){
return true;
}
return false;
}
});
//过滤文件名以.java结尾的文件
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
//这里的this为当前文件夹。为File类。
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
//最后强转?
return (String[])(v.toArray(new String[v.size()]));
}
6.delete
只能删除空文件夹和单个文件。
7.构造函数的路径
new File("src.txt");//出现在当前项目中的根目录。
new File("src/abc.txt");//在当前项目中的根目录下的src文件夹下。
new File("/abc.txt");//在当前盘符的根目录下。
new File(new File("C:\abc"),"xyz\abc.txt");
//创建的目录为C:\abc\xyz\abc.txt
不看了