`
wdhdmx
  • 浏览: 300424 次
  • 性别: Icon_minigender_1
  • 来自: 山西
博客专栏
D4bbb5f7-9aa4-3e66-8194-f61b3f0241c2
天天编程
浏览量:21529
社区版块
存档分类
最新评论

File源码理解

阅读更多

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
 

不看了

分享到:
评论

相关推荐

    Tomcat源码开发环境搭建

    手把手教你搭建Tomcat7源码开发环境,如果有了如下说明还搭建不成功,建议考虑下自己的理解能力,能不能走编码这条路。附近包括Tomcat源码、Tomcat源码开发环境依赖的包、Tomcat的环境编译工具ant 1、建立如下...

    课程设计-基于预训练模型BERT的阅读理解python源码+使用说明.zip

    基于预训练模型BERT的阅读理解python源码+使用说明.zip 1. Prepare data, the virtual python environment and install the package in requirements.txt 2. Run the command below to fine tune ```bash python ...

    openjdk12源码.zip

    注意!看了周志明的《深入理解Java虚拟机》上面帖的地址。上面的网站下载得文件不知道是服务器的原因还是什么只有1m多。 从网上找到的正常文件。编译openjdk12源码,调试jvm。可以下载这个

    疯狂Android讲义源码

     第4章 深入理解Activity 169  4.1 建立、配置和使用Activity 170  4.1.1 建立Activity 170  4.1.2 配置Activity 177  4.1.3 启动、关闭Activity 179  4.1.4 使用Bundle在Activity之间  交换数据 181  4.1.5...

    Minix2.0 文件系统解析程序(含源码)

    对网络上minix1.0文件系统的修正和功能扩充,是学习minix的不可多得的工具帮手, 尤其是理解minix文件系统组织结构和源码有力工具。 修改日期: hugion 2009.6.14 增加内容:扩充对minix2.0文件系统的支持 包括minix...

    飞鸽传书(IPMessenger) 源码

     - 本软件为自由软件, 你可以随意传播, 但源码使用请参见许可协议.  - 只有在启动或退出程序, 使用离开模式, 刷新在线用户时 IPMsg 才会进行消息广播.  - 本软件由 Microsoft Visual C++ 6.0 编译 广域网设置...

    I inux 系统的二级文件系统(QT实现了简单界面,包含原始控制台源码)操作系统- Linux

    包含qt完整的工程目录以及原始的一份控制台源码。代码有问题可以评论。 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件...

    通用管理系统配置源码

    通用管理系统系统配置源码 许多应用程序都需要配置 这种配置可以用数据库作为存储,但是仅仅为了一个记录,建立一个表格,有点太浪费,所以最好用xml进行以文本方式存放,在配置不大的情况下,读写文本文件比...

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...

    PHP和MySQL Web开发第4版pdf以及源码

    5.2.3 使用auto_prepend_file和auto_append_file 5.3 在PHP中使用函数 5.3.1 调用函数 5.3.2 调用未定义的函数 5.3.3 理解字母大小写和函数名称 5.4 理解为什么要定义自己的函数 5.5 了解基本的函数结构 ...

    linux系统的二级文件系统(QT实现了简单界面,包含原始控制台源码)

    包含qt完整的工程目录以及原始的一份控制台源码。代码有问题可以评论。 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件...

    .Iinux系统的二级文件系统(QT实现了简单界面,包含原始控制台源码)操作 系统- Linux

    包含qt完整的工程以及原始的一份控制台源码。代码有问题可以评论。 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件系统。...

    驱动程序设计基础专题-filedisk源码分析

    argv[]指向3个字符串,这些理解了。后面就没问题了。它是根据 argc来判断参数应该使用的命令。 应用层总体思路: (argc==5 || argc==6)因为其中有一个是可选的,进行操作是Mount。分析代码时,请一边看结果,一 ...

    Python特定文件备份方法源码

    简单的来理解就是:我们只对某个特定后缀名的文件进行检测及备份;在for file in files 循环的内部加一个适当的测试就可以实行了。 Python 文件备份 这里举一个例子: name, ext = os.path.splitext(file) if ext ...

    Python基于深度学习的区域人员计数系统(源码+项目说明).zip

    通过这些资源,其他人可以快速理解和使用本研究的方法和系统。 本研究的意义在于提供了一种新的、基于深度学习的人员计数系统,可以应用于各种领域和场景。与传统的计数方法相比,本系统具有更高的准确性和智能性,...

    基于PHP开发的拟态风格的简约API管理系统源码+使用说明.zip

    我在main.json中写了几个例子,方便理解 目录:api/tongji,此API请勿删除或更改名称,否则将会影响API调用统计。 在自己的API中顶部加入代码,即可开始统计API总体调用次数 (记得把域名改成API管理站点的域名...

    Flink1.14.4版本集成ElasticsearchSink组件初阶+进阶实战源码,下载解压可用,有疑问可在评论区@我

    天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch gitee代码仓库地址: https://gitee.com/shawsongyue/aurora_flink/tree/develop/aurora_elasticsearch_connector

    java开发oa办公系统源码-oa:智能办公系统

    java开发oa办公系统源码 智能办公系统 一、介绍 1、本项目为90%开源项目,用户可以用户开发学习,用户可自主开发除工作流以外的业务系统。 2、前往微信公众号查看详情: 二、软件架构 本项目JDK8x64+SpringBoot+...

    hadoop-2.2.0.tar.gz 64位 part1 hadoop源码包编译为linux64位版本

    本人经过4个小时顺利将hadoop官方的32位编译为64位,通过测试可用,方便在64位linux安装hadoop的用户使用,编译时间很长,也很苦啊,解决了很多报错的问题,所以分多要一点,还望理解! 注:*****因为本人CSDN等级...

    PHP File Manager(PHP文件管理器) v0.9.8 中文版

    同时支持切换多种语言(来自国外,本人加上了中文语言,确保无语言理解误区),可更换排序方式。可谓是麻雀虽小,五脏俱全。无任务时不会自动后台运行,无需数据库;使用时占用cpu很小。只要将其放在根目录,需要时...

Global site tag (gtag.js) - Google Analytics