浅谈File类

这个家伙到底是个什么东东

File:中文翻译为 文件、档案。
看到这个解释。你可能会理所当然的认为这相当于Windows/Linux系统中的一个实体文件或目录,但这是一个大坑,当初我就跳坑里了。实际上,它代表的是一个特定文件的名称,或一个目录下的一组文件的名称。注意:它仅仅代表的是一个名称!名称!名称!重要的事情说3遍!看到这里,可能会蒙圈,不要着急,慢慢往下看。

先说说构造方法

FIle(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。
File(String parent,String child)根据父路径名字符串和子路径名字符串创建新的File实例。

上面这是JDK的解释,如果没有实践过,谁看谁懵逼。如果仔细分析,也就那么回事。
先说说什么是“路径名字符串”。
首先,我想在我电脑的E盘下创建一个名为 b.txt 的文件。

File file = new File("E:\b.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Console显示:
​​​​这里写图片描述
嘿嘿,中奖了。如果我将上面的代码稍微改一下,看看有什么不同。

File file = new File("E:\\b.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

成功了!
这里写图片描述
为什么出现这种现象呢?下面展示的表格请大家仔细对比。

错误的路径名正确的路径名Windows系统的路径名
E:\b.txtE:\\b.txt。E:\b.txt

这里我们会发现以下2点:

  1. 正确的路径名比错误的路径名多了一个反斜线 “\”。

  2. 错误的路径名和Windosw系统下的路径名一样。

第一次写的时候我就掉到这个坑里了。

这里,正确的路径名代表的是:路径名字符串; 抽象路径名: Windows系统的路径名。

为什么这么写呢?直接一致不好吗?

因为市面上流行的操作系统有很多,例如服务器端的Linux、Unix系统,常用的Windows系统等等。他们路径名的写法不一致。Java开发者不可能为每个系统都编写一个方法来区分不同的操作系统,如果我在Windows上编写的程序跑到Linux或Unix系统上运行怎么办,我在改一下?这也不符合Java跨系统运行的特性。解决的方法就是提供统一的路径名,不同的系统解释为不同的抽象路径,这样就可以了。

说完了第一个构造方法,我们再来说第二个。

我要在E:\parent目录下新建一个b.txt文件。

//首先,先创建E:\parent文件夹
File file = new File("E:\\parent");
file.mkdir();

//使用FIle(String pathname)创建b.txt文件。
File file = new File("E:\\parent\\b.txt");
file.createNewFile();

//使用File(String parent,String child)创建b.txt文件
File file = new File("E:\\parent","b.txt");
file.createNewFile();

这里写图片描述
这里:String parent就是b.txt所属的目录路径名字符串。String child代表b.txt文件的名字,注意这是文件名,不是完整的路径名字符串。其实单独看参数名更好理解一点,parent、child:老子和儿子。。。。
通过比较两个构造函数,看起来好像它们好像没什么区别,我也是这么认为的!哈哈。但也有一些细微的差别,使用FIle(String pathname)创建子类文件有些歧义,代表b.txt完整路径名,和Windows系统目录分层结构相比,就是看起来费劲吧!File(String parent,String child),更能体现文件和文件夹的所属关系,更加的清晰明了一些。使用这两个都没有错误,看个人习惯吧。
还有其他构造函数,这里只是列举了常用的,具体实现大家可以查询API。

好了,构造函数说完了,现在就来解释一下为什么File类代表的仅仅是抽象路径名。

如果你这样写:

File file = new File("E:\\parent\\a.txt");

你会发现什么也没干,磁盘下没有E:\parent\a.txt文件。
但如果这样:

File file = new File("E:\\parent\\a.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

会发现E:\parent目录下生成了a.txt文件。
这样就知道了createNewFile()才是真正的文件创建者。他会根据file提供的路径名,创建一个文件。这个方法会抛IOException,因为我们不能保证IO是否一定会执行,在程序执行的过程中,可能会发生中断,不能保证正确的读写。
注意:如果提供相同的File对象,createNewFile()不会再创建相同的文件,也不会覆盖。
扩展:createNewFile(“\b.txt”):会在根磁盘(也就是系统所在的盘符)下创建一个b.txt文件。
哎!不知不觉已经写了这么多了。坚持!我会写完的!

常用的方法:

  1. mkdir():创建一个目录(文件夹)
//在当前工程中新建一个文件夹test
        File file = new File("test");
        file.mkdir();

//在根磁盘下新建一个文件夹test
        File file = new File("\\test");
        file.mkdir();

//在E:盘下新建文件夹test
        File file = new File("E:\\test");
        file.mkdir();

//在E:盘下新建文件夹a,a下新建b文件夹,b下新建c文件夹
        File file = new File("E:\\a\\b\\c");
        file.mkdirs();   //创建多级目录   注意:这里使用mkdir()是不行的,它只能一个一个创建文件夹。

2.list()和listFiles();

//list 返回的是file下的文件名或目录名数组
File file = new File("E:\\a\\b");
String[] list = file.list();  //返回c

//listFiles()   返回的是file下的抽象路径名数组
File[] list = file.listFiles();  //返回E:\a\b\c

3.常用的方法

delete(); //删除由此File表示的文件或目录。
getAbsolutePath();  //返回由此File表示的抽象路径名。
getName();   //返回在此File表示的文件名。
length();    //返回由此File表示的文件的长度
isFile();    //File表示的 是否 是文件
//更多方法及使用详情参见API

文件路径:

绝对路径:从磁盘根目录开始的路径  D:\eclipse\configuration\config.ini
相对路径:对于当前文件夹的目标路径,config.ini相对于D:\eclipse的相对路径为configuration\config.ini  

写了一晚上了,坚持不住了,明天继续写FileFilter类和FilenameFilter类的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值