Java File类

File 是“文件”和“目录路径名”的抽象表示形式,它直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap中)。

定义

public class File  extends Object  implements Serializable, Comparable<File>

File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。

构造函数

//通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,那么结果是空抽象路径名。
File(String pathname)
//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
//如果 parent 为 null,则创建一个新的 File 实例,这与调用给定 child 路径名字符串的单参数 File 构造方法的效果一样。否则,parent 抽象路径名用于表示目录,child 路径名字符串用于表示目录或文件。如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。如果 parent 是空抽象路径名,则通过将 child 转换为抽象路径名,并根据与系统有关的默认目录解析结果来创建新的 File 实例。否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。
File(File parent, String child)
//根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
//如果 parent 为 null,则创建一个新的 File 实例,这与调用以给定 child 路径名字符串作为参数的单参数 File 构造方法效果一样。
//否则,parent 路径名字符串用于表示目录,child 路径名字符串用于表示目录或文件。如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。如果 parent 是空字符串,则通过将 child 转换为抽象路径名,并根据与系统有关的默认目录解析结果来创建新的 File 实例。否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。
File(String parent, String child)
//通过将给定的 file: URI转换为一个抽象路径名来创建一个新的 File 实例。
//file: URI 的具体形式与系统有关,因此,由此构造方法执行的转换也与系统有关。
//对于某个给定抽象路径名 f,可以保证:new File( f.toURI()).equals(f.getAbsoluteFile())
//只要原始抽象路径名、URI 和新抽象路径名都是在同一 Java 虚拟机(或者它的不同调用)中创建的。但是,当在某一操作系统上的虚拟机中创建的file: URI 在不同操作系统上的虚拟机中被转换为抽象路径名时,这种关系通常是不成立的。
File(URI uri)

利用构造方法,指定路径名、文件名等来构造File类的对象,之后调用该对象的createNewFile()方法就可以创建出相应的文件。

parent指定路径(父目录),可以是File类对象也可以是字符串,child中也可以加入路径层级,但要注意,所用的路径必须存在,不存在的路径不会新建。

静态成员

// 静态成员
public static final String     pathSeparator        // 路径分割符":",此字段被初始化为包含系统属性 file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
public static final char     pathSeparatorChar    // 路径分割符':',此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ':';在Microsoft Windows 系统上,它为 ';'。
public static final String     separator            // 分隔符"/"
public static final char     separatorChar        // 分隔符'/'

方法

// 成员函数
boolean    canExecute()    // 测试应用程序是否可以执行此抽象路径名表示的文件。
boolean    canRead()       // 测试应用程序是否可以读取此抽象路径名表示的文件。
boolean    canWrite()      // 测试应用程序是否可以修改此抽象路径名表示的文件。
int    compareTo(File pathname)    // 按字母顺序比较两个抽象路径名。
boolean    createNewFile()         // 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
static File    createTempFile(String prefix, String suffix)    // 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
static File    createTempFile(String prefix, String suffix, File directory)    // 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
boolean    delete()             // 删除此抽象路径名表示的文件或目录。
void    deleteOnExit()       // 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
boolean    equals(Object obj)   // 测试此抽象路径名与给定对象是否相等。
boolean    exists()             // 测试此抽象路径名表示的文件或目录是否存在。
File    getAbsoluteFile()    // 返回此抽象路径名的绝对路径名形式。
String    getAbsolutePath()    // 返回此抽象路径名的绝对路径名字符串。
File    getCanonicalFile()   // 返回此抽象路径名的规范形式。
String    getCanonicalPath()   // 返回此抽象路径名的规范路径名字符串。
long    getFreeSpace()       // 返回此抽象路径名指定的分区中未分配的字节数。
String    getName()            // 返回由此抽象路径名表示的文件或目录的名称。
String    getParent()          // 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
File    getParentFile()      // 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
String    getPath()            // 将此抽象路径名转换为一个路径名字符串。
long    getTotalSpace()      // 返回此抽象路径名指定的分区大小。
long    getUsableSpace()     // 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
int    hashCode()               // 计算此抽象路径名的哈希码。
boolean    isAbsolute()         // 测试此抽象路径名是否为绝对路径名。
boolean    isDirectory()        // 测试此抽象路径名表示的文件是否是一个目录。
boolean    isFile()             // 测试此抽象路径名表示的文件是否是一个标准文件。
boolean    isHidden()           // 测试此抽象路径名指定的文件是否是一个隐藏文件。
long    lastModified()       // 返回此抽象路径名表示的文件最后一次被修改的时间。
long    length()             // 返回由此抽象路径名表示的文件的长度。
String[]    list()           // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[]    list(FilenameFilter filter)    // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[]    listFiles()                        // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[]    listFiles(FileFilter filter)       // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[]    listFiles(FilenameFilter filter)   // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
static File[]    listRoots()    // 列出可用的文件系统根。
boolean    mkdir()     // 创建此抽象路径名指定的目录。
boolean    mkdirs()    // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
boolean    renameTo(File dest)    // 重新命名此抽象路径名表示的文件。
boolean    setExecutable(boolean executable)    // 设置此抽象路径名所有者执行权限的一个便捷方法。
boolean    setExecutable(boolean executable, boolean ownerOnly)    // 设置此抽象路径名的所有者或所有用户的执行权限。
boolean    setLastModified(long time)       // 设置此抽象路径名指定的文件或目录的最后一次修改时间。
boolean    setReadable(boolean readable)    // 设置此抽象路径名所有者读权限的一个便捷方法。
boolean    setReadable(boolean readable, boolean ownerOnly)    // 设置此抽象路径名的所有者或所有用户的读权限。
boolean    setReadOnly()                    // 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
boolean    setWritable(boolean writable)    // 设置此抽象路径名所有者写权限的一个便捷方法。
boolean    setWritable(boolean writable, boolean ownerOnly)    // 设置此抽象路径名的所有者或所有用户的写权限。
String    toString()    // 返回此抽象路径名的路径名字符串。
URI    toURI()    // 构造一个表示此抽象路径名的 file: URI。
URL    toURL()    // 已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。

目录操作

1. 返回文件名数组

String[] list()
String[] list(FilenameFilter filter)

2. 返回File数组

File[] listFiles()
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter filter)

例子

/**
 * File类有一个listFiles(FileNameFilter filter).
 * 只需要实现一个简单的filter就可以找到满足fileter条件的所有文件。
 * 例如我要在E:\data\file_selector_test 目录下面查找以.txt结尾的文件,我可以这么做。见下例。
 * @author Administrator
 *
 */
public class FileNameSelector implements FilenameFilter {
    String extension = ".";

    public FileNameSelector(String fileExtensionNoDot) {
        extension += fileExtensionNoDot;
    }

    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(extension);
    }
    
    public static void main(String[] args) {
        
        File directory = new File("E:\\test\\file_selector_test");
        //listFiles()列出所有文件
        File[] files = directory.listFiles();
        System.out.println("\n目录" + directory.getName() + "下的所有文件");
        for (File file : files) {
            System.out.print("  " + file.getName());
        }
        //listFiles(FileNameFilter filter)列出所有.txt文件
        File[] txtFiles = directory.listFiles(new FileNameSelector("txt"));
        System.out.println("\n目录" + directory.getName() + "下的.txt文件");
        for (File file : txtFiles) {
            System.out.print("  " + file.getName());
        }
        //isDirectory()判断是否为文件目录
        if(directory.isDirectory()){
            System.out.println(directory.getPath()+" is Directory");
        }
        //isFile()判断是否为文件
        if(directory.isFile()){
            System.out.println(directory.getPath()+" is File");
        }
        
        //File.separator输出不同的系统中斜杠的方向
        //在windows中斜杠的方向是向右斜的\\
        //在Linux  中斜杠的方向是向左斜的//
        System.out.println("File.separator:"+File.separator);
        File f= new File("e:" + File.separator + "test" + File.separator +"file_selector_test"+File.separator+ "io.txt");
        try {
            //createNewFile()方法:创建指定文件夹下的文件,如果文件夹不存在会报"找不到指定路径"错误,应该首先手动创建该文件夹。返回值为boolean
            //若没有该文件,创建成功返回true;若又该文件则创建失败返回false
            System.out.println(f.createNewFile());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //delete()方法:删除一个文件或者整个文件夹,返回值为布尔类型
        //如果删除的是文件夹,必须保证是一个空文件夹,否则删除失败
        File f0 = new File("E:\\test\\file_selector_test\\io.txt");
        boolean boo=f0.delete();
        if(boo){
            System.out.println("成功删除文件");
        }else{
            System.out.println("删除失败");
        }
        //调用创建的方法进行删除文件夹以及该文件夹下的所有文件
        deleteDirectory(new File("E:\\test\\file_selector_test2"));
        
        File f1 = new File("e:" + File.separator + "test"+File.separator+"io.txt");
        //getPath()方法:将此抽象路径名转换为一个路径名字符串
        System.out.println(f1.getPath());
        //getParent()方法:返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 nul
        System.out.println(f1.getParent());
        if(f1.exists()){
            f1.delete();
        }
        else{
            try{
                System.out.println(f1.createNewFile());
            }catch(Exception e){}
        }
        
        //list()方法:返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录,列出的仅是名称。
        File f2 = new File("E:\\test\\file_selector_test");
        String[] str = f2.list();
        for(int i=0;i<str.length;i++){
            System.out.println(str[i]);
        }
        
        //扫描某个路径下的所有文件
        findAllFiles(new File("E:\\"));
    }
    
    //删除文件夹下的所有文件以及该文件夹
    public static void deleteDirectory(File file){
        File[] fileArray=file.listFiles();
        if(fileArray.length>0){
            for(int i=0;i<fileArray.length;i++){
                if(fileArray[i].isFile()){
                    if(fileArray[i].delete()){
                        System.out.println(fileArray[i]+"文件删除成功");
                    }else{
                        System.out.println(fileArray[i]+"文件删除失败");
                    }
                }else{
                    deleteDirectory(fileArray[i]);
                }
            }
        }
        //删除文件夹
        if(file.delete()){
            System.out.println(file+"文件夹删除成功");
        }else{
            System.out.println(file+"文件夹删除失败");
        }
    }

    //扫描指定文件夹下的所有文件,并输出
    public static void findAllFiles(File f){
        //判断给定的路径是否是目录
        if(f.isDirectory()){
            File[] file = f.listFiles();
            //再依次循环进行判断
            try{
                for(int i = 0;i < file.length;i++){
                    //继续把内容传入到findAllFiles方法之中进行验证
                    findAllFiles(file[i]);
                }
            }catch(Exception e){}
        }
        else{
            System.out.println(f);
        }
    }
}

总结

1. File类的直接父类是Object类。

2. 一个File类的对象,表示了磁盘上的文件或目录。

3. File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。因为不同的系统平台对文件路径的描述不尽相同,所以为了做到平台无关,在Java语言中,使用抽象路径等概念。Java自动进行不同系统平台的文件路径描述与抽象文件路径之间的转换。

4. File类直接处理文件和文件系统。

5. File类没有指定信息怎样从文件读取或向文件存储。

6. File类描述了文件本身的属性。(读写属性等)。

7. File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。

8. File类还可以浏览子目录层次结构。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。