文档章节

探究java IO之File类

柳哥
 柳哥
发布于 2014/11/13 23:02
字数 1483
阅读 170
收藏 13

尽管java.io定义的大多数类用于操作流,但File类却不是。File类直接处理文件文件系统。也就是说,File类没有指定如何从文件检索信息以及如何向文件中存储信息,而是描述了文件本身的属性。File对象用于获取和操作与磁盘文件关联的信息,例如权限,时间日期以及目录路径,并且还可以浏览子目录层次。

注意:由JDK7NIO系统增加的Path接口和File类,在许多情况下都为File类提供了强大的替换方案,具体看后面的NIO章节。

下面的构造函数可以用于创建File对象:

File(String directoryPath)
File(String directoryPath,String filename)
File(File dirObj,String filename)
File(URI uriObj)

其中,directoryPath是文件的路径名;filename是文件或子目录的名称; dirObj是指定目录的File对象;uriObj是描述文件的URI对象。

注意:Java使用介于UNIXWindows约定之间的路径分隔符。如果在Windows版本的Java中使用正斜杠/),那么路径仍然会被正确解析。请记住,如果使用Windows约定的反斜杠\),那么在字符串中需要使用转义序列\\)。

我们来看看File调用的示例:

package io;

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File f1 = new File("/home/fuhd/apache/apr-1.5.1.tar.gz");
        //返回文件名
        System.out.println("File name:" + f1.getName());
        //返回文件路径
        System.out.println("Path:" + f1.getPath());
        //返回绝对路径
        System.out.println("Abs Path:" + f1.getAbsolutePath());
        //返回父目录路径
        System.out.println("Parent:" + f1.getParent());
        //是否存在
        System.out.println(f1.exists() ? "exists" : "does not exist");
        //是否有权限写
        System.out.println(f1.canWrite() ? "is writeable" : "is not writeable");
        //有否有权限读
        System.out.println(f1.canRead() ? "is readable" : "is not readable");
        //是否是文件
        System.out.println(f1.isFile() ? "is normal file" : "might be a maned pipe");
        //是否有绝对路径
        System.out.println(f1.isAbsolute() ? "is absolute" : "is not absolute");
        //文件最后修改时间
        System.out.println("File last modified:" + f1.lastModified());
        //文件大小
        System.out.println("File size:" + f1.length() + " Bytes");
    }
}

File类还提供了两个有用的实用方法。第一个方法是renameTo(),如下所示:

boolean renameTo(File newName)

其中,由newName指定的文件名成为调用File对象的新名称。如果操作成功,就返回true,如果文件不能被重命令就返回false。第二个实用方法是delete(),该方法删除调用File对象的路径所代表的磁盘文件。该方法如下:

boolean delete()

如果目录为空的话,可以使用delete()方法删除这个目录。如果删除成功,delete()方法将返回true;如果不能删除文件,就返回false。

JDK7为File类新增了方法 toPath(),该方法如下所示:

Path toPath()

toPath()方法返回的Path对象表示由调用File对象封装的文件(换句话说,toPath()方法可以将File对象转换成Path对象)。Path是由JDK7新添加的接口。该接口被打包到java.nio.file包中,是NIO组成部分。因此,toPath()方法在旧的File类和新的Path接口之间搭建了一所桥梁。(当然,以上的方法都不是File类的全部,这里只是做了部分介绍而已)

目录

目录是包含一系列其他文件和目录的File对象。当为目录创建File对象时,isDirectory()方法将会返回true。在这种情况下,可以对File对象调用list()方法以提取内部的其他文件和目录列表。如例:

package io;

import java.io.File;

public class DirList {
    public static void main(String[] args) {
        String dir = "/home/fuhd/apache";
        File file = new File(dir);
        if(file.isDirectory()){
            String[] fileList = file.list();
            if(fileList != null && fileList.length > 0){
                for(String f1 : fileList){
                    System.out.println("文件名:" + f1);
                }
            }
        }
    }
}

使用FilenameFilter接口

经常会希望限制list()方法返回的文件数量,使返回结果只包含匹配特定模式(或称为过滤器)的那些文件。为此,必须使用list()方法的第二种形式:String[] list(FilenameFilter ffobj,在这种形式中,ffobj是实现了FilenameFilter接口的类的对象。FilenameFilter接口只定义了方法accept()该方法针对列表中的每个文件调用一次,一般形式如下所示:boolean accept(File directory,String filename),在由directory指定的目录中,对于那些应当被包含到列表中的文件(也就是那些能匹配filename参数的文件),accept()方法返回true;对于那些应当排除的文件,accept()方法返回false。

package io;

import java.io.File;
import java.io.FilenameFilter;

public class DirListOnly {
    public static void main(String[] args) {
        String d = "/home/fuhd/apache";
        File f = new File(d);
        FilenameFilter filter = new OnlyExt("tar.gz");
        String[] files = f.list(filter);
        for(String fileName : files){
            System.out.println(fileName);
        }
    }
}

class OnlyExt implements FilenameFilter {
    String ext;
    public OnlyExt(String ext) {
        this.ext = "." + ext;
    }
    public boolean accept(File dir,String name){
        return name.endsWith(ext);
    }
}

listFiles()方法

list()方法还有一种形式,称为listFiles(),你可能会发现该方法很有用。listFiles()方法的签名如下:

File[] listFiles()
File[] listFiles(FilenameFilter ffobj)
File[] listFiles(FileFilter fobj)

这些方法将文件列表作为File对象而不是字符串数组返回。第1个方法返回所有文件,第2个方法返回那些满足指定的FilenameFilter的文件。除了返回的是File对象数组之外,就工作方法而言,这两个版本的listFiles()方法和它们等价的list()方法类似。第3个版本的listFiles()方法返回那些路径名称能满足指定的FileFilter文件。FileFilter只定义了方法accept(),该方法针对列表中的每个文件调用一次,一般形式如下:

boolean accept(File path)

对于应当包含到列表中的文件(也就是那些能匹配path参数的文件),该方法返回 true;对于那些应当排除的文件,该方法返回false。

创建目录

File类提供的另外两个有用的实用方法是mkdir()和mkdirs()。mkdir()方法用来创建目录,如果成功,就返回true;否则返回false;要为不存在的路径创建目录,可以使用mkdirs()方法,该方法创建目录及其所有父目录

© 著作权归作者所有

柳哥
粉丝 207
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
加载中

评论(1)

commonum
commonum
不错,感谢总结
JavaIO/输出输入入门

IO称之为输入输出,Java的IO是通过java.io包下的类和接口来支持,包含两大类:输入,输出. 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write...

Zhao-Qian
2013/01/04
468
0
Java FileInputStream

一、序言 IO操作,才程序中比较普遍,JAVA 中提出了IO/NIO 的概念,也一直在说NIO 比IO快,一直不知道原因,就想memcache 和ehcache 比较优劣一样,这些东西得自己看看如何实现的,才 知道区...

pczhangtl
2014/08/03
162
0
泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
04/02
0
0
《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程

第15章 Kotlin 文件IO操作与多线程 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎...

程序员诗人
2017/07/24
0
0
第9章 文件IO操作、正则表达式与多线程

第9章 文件IO操作、正则表达式与多线程 我们在《第6章 扩展函数与属性》中已经介绍过Kotlin中的类扩展的特性。使用Kotlin的扩展函数功能,我们可以直接为 String 类实现一个 inc() 函数,这个...

程序员诗人
2017/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
13
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部