欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java输入输出--文件操作

程序员文章站 2024-03-16 23:01:52
...

File 类

在进行文件操作时,需要知道一些关于文件的信息。 File 类提供给了一些方法来操纵文件 和获取文件的信息。对于目录, Java 把它当做一种特殊类型的文件,即文件名单列表。

File 类直接处理文件和文件系统。 通过 File 类的方法,可以得到文件或者目录的描述信息,包括名称, 所在路径, 读写性, 长度等。还可以创建目录,创建文件,改变文件名,删除文件,列出目录中的文件等。

File 类的声明如下:

public class File extends Object implements Serializable

构造方法:

File(String path);
File(String dir, String filename);
File(File dir, String filename);
File(URI uri);

其中 ,dir 是文件所在的目录,filename 是文件名,path 是文件的路径名。

File f1 = new File("D:/Java");
File f2 = new File("D:/Java", "test.txt");
File f3 = new File(f1,"test.txt");
File f4 = new File("file://D:/Java/test.txt");

注意: Java 能正确处理 Unix 和 Windows/Dos 约定的路径分隔。 如果在Windows 版本的 Java 下用斜线(/),路径处理依然正确。 记住,如果在 Windows/Dos 系统中使用反斜线(\)则需要在字符串内使用它的转义序列(\)Java 约定用 UNIX 和 URL 风格的斜线来作路径分隔符。

File 定义了很多获取 File 对象标准属性的方法。 例如:getName() 返回文件名,getParent() 返回父目录名, exists() 在文件存在的情况下返回 true, 否则返回 false.

File 类提供的方法:

创建一个文件对象后, 可以用 File 类提供的方法来获得文件相关信息,对文件进行操作。

方法 描述
boolean canRead() 测试文件是否可读
boolean canWrite() 测试文件是否可写
int compareTo(File pathname) 比较两个文件的名称
boolean createNewFile() 创建文件
static File createTempFile(String prefix, String suffix) 在默认的临时文件目录创建一些空文件
boolean delte() 删除文件
void deleteOnExit() 在 Java 虚拟终端机终止时删除与调用对象相关的文件
boolean equals(Object obj) 比较两个文件对象
boolean exists() 测试文件是否存在
File getAbsoluteFile() 返回绝对文件名
String getAbsolutePath() 返回绝对路径
String getCanonicalPath() 返回规范的路径字符串
String getName() 返回文件名(不包括路径)
String getParent() 返回父目录
String getPath() 返回路径
boolean isAbsolute() 是否为绝对路径
boolean isDirectory() 是否为目录
boolean isFile() 是否为文件
boolean isHidden() 是否隐藏文件
long lastModified() 上次修改时间,从 1970 年 1 月 1 日 开始的标准时间的毫秒数
long length() 文件长度
String[] list() 列出目录中的文件
String[] list(FilenameFilter filter) 使用过滤器列出目录中的文件
static File[] listRoots() 列出所有的根目录
boolean mkdir() 创建目录
boolean mkdirs() 创建多层目录
boolean renameTo(File dest) 重命名文件
boolean setLastModified(long time) 设置上次修改时间
boolean setReadOnly() 设置为只读
String toString() 把文件对象转化成字符串
URi toURI() 把文件对象转化成 URI 对象
URL toURL() 把文件对象转化成 URL 对象
import java.io.File;
import java.io.IOException;
public class FileDemo {
    public static void main(String[] args) throws IOException{
        System.out.println("path separator: "+ File.pathSeparator);
        System.out.println("path separator char: "+ File.pathSeparator);
        System.out.println("separator: "+ File.separator);
        System.out.println("separator char: "+ File.separatorChar);

        File dir = new File("D:\\JAVA\\Java File");
        File f = new File(dir, "FileDemo.class");
        File path = new File("D:\\JAVA\\Java File\\FileDemo.class");
        File f2 = new File("file:\\D:\\JAVA\\Java%20File\\FileDemo.class");

        System.out.println("");
        System.out.println(f);
        System.out.println("exist: " + f.exists());
        System.out.println("name: " + f.getName());
        System.out.println("path: " + f.getPath());
        System.out.println("absolute path: " + f.getAbsolutePath());
        System.out.println("parent: " + f.getParent());
        System.out.println("is a file: " + f.isFile());
        System.out.println("is a dir: " + f.isDirectory());
        System.out.println("length: " + f.length());
        System.out.println("can read: " + f.canRead());
        System.out.println("can write: " + f.canWrite());
        System.out.println("last Modified: " + f.lastModified());

        f.setLastModified(f.lastModified() + 1102304);
        System.out.println("last Modified: " + f.lastModified());
        System.out.println("Canonical Path: " + f.getCanonicalPath());

        File newF = new File("newFile.class");
        System.out.println("----Rename " + f + " ------");
        f.renameTo(newF);

        System.out.println("name: " + newF.getName());
        System.out.println(f + " exist? " + f.exists());
        System.out.println(newF +" exist? " + f.exists());
        System.out.println("convert to URI" + f.toURI());
        System.out.println("compare f to path:" + f.compareTo(path));
        System.out.println("compare f to f2:" + f.compareTo(f2));
        System.out.println("---- delete "+ newF + " ------");
        newF.delete();
        System.out.println(newF + " exist? "+ newF.exists());
    }

}
// path separator: ;
// path separator char: ;
// separator: \
// separator char: \

// D:\JAVA\Java File\FileDemo.class
// exist: true
// name: FileDemo.class
// path: D:\JAVA\Java File\FileDemo.class
// absolute path: D:\JAVA\Java File\FileDemo.class
// parent: D:\JAVA\Java File
// is a file: true
// is a dir: false
// length: 0
// can read: true
// can write: true
// last Modified: 1531019202728
// last Modified: 1531020305032
// Canonical Path: D:\JAVA\Java File\FileDemo.class
// ----Rename D:\JAVA\Java File\FileDemo.class ------
// name: newFile.class
// D:\JAVA\Java File\FileDemo.class exist? true
// newFile.class exist? true
// convert to URIfile:/D:/JAVA/Java%20File/FileDemo.class
// compare f to path:0
// compare f to f2:-2
// ---- delete newFile.class ------
// newFile.class exist? false

目录

目录是一个包含其他文件和路径列表的 File 类。当创建一个 File 对象 且 它是 目录时,则 isDirectory() 方法返回 true 。 在这种情况下, 可以调用该对象的 list() 方法来提取该目录内部其他文件和目录的列表 。 该方法有两种形式:

第一种:文件名列表在一个 String 对象的数组中返回

String[] list();

第二种:文件对象列表在 一个 File 对象的数组中返回。

File[] listFiles();

有时 需要列出目录下制定类型的文件,比如. java、.class 等扩展名的文件。可以使用 File 类的 下述 3 个方法,列出制定类型的文件。

String[] list(FilenameFilter FFObj);
File[] listFiles(FilenameFilter FFObj);
file[] listFiles(FileFilter FObj);

第一种方法用 字符串形式返回目录下指定类型的文件;
第二种方法用 File 对象数组 的形式 返回目录下的指定类型的文件;
第三种方法也是用 File 对象数组的形式返回目录下的指定类型的文件,和第二种方法不同的是,其参数类型不同。

参数 FFObj 是一个实现 FilenameFilter 接口的类的对象。

FilenameFilter 仅定义了一个方法,即 accept(). 调用 list 方法 列出文件时,将调用 accept() 方法检查该文件名称是否符合 accept 方法指定的名字要求。其一般形式如下:

boolean accept(File directory, String filename);

如果 返回 true ,则名称为 filename 的文件包含在 返回列表中; 反之,不包含在返回列表中。

FObj 是一个实现了 FileFilter 接口的类的对象。 FileFilter 只定义了一个 accept() 方法,该方法针对目录中的每一个文件调用一次,它不仅可以根据文件名过滤文件,也可以根据文件的其他信息过滤文件。 其一般形式如下:

boolean accept(File path);

如果 返回值是 true,则 path 代表的文件包含在返回列表中;反之,不包含在返回列表中。

import java.io.File;
import java.io.FileFilter;
public class FileDemo {
    public static void main(String[] args) {

        File dir = new File("D:\\JAVA\\Java File");
        System.out.println("列出目录 " + dir + " 中的 class 文件:");
        Filter filter = new Filter("class");
        File fs1[] = dir.listFiles(filter);
        display(fs1);

        System.out.println("列出目录 " + dir + "中的 子目录");
        DirFilter filter2 = new DirFilter();
        File fs2[] = dir.listFiles(filter2);
        display(fs2);

        // 创建一个子目录:
        File f = new File(fs2[0].getPath() + "_newDir");
        System.out.println(f.mkdir());
        File fs3[] = dir.listFiles(filter2);
        display(fs3);
    }
    public static void display(File[] fs){
        for (int i = 0; i< fs.length; i++){
            if(fs[i].isDirectory()){
                System.out.println("目录:" + fs[i]);
            }else{
                System.out.println("文件:" + fs[i]);
            }
        }
        System.out.println(" ");
    }

}

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

public class DirFilter implements FileFilter {
    public boolean accept(File path){
        return path.isDirectory();
    }
}
// 列出目录 D:\JAVA\Java File 中的 class 文件:
// 文件:D:\JAVA\Java File\Exam.class
// 文件:D:\JAVA\Java File\FileDemo.class
// 文件:D:\JAVA\Java File\Graph.class

// 列出目录 D:\JAVA\Java File中的 子目录
// 目录:D:\JAVA\Java File\class
// 目录:D:\JAVA\Java File\class_newDir
// 目录:D:\JAVA\Java File\history
// 目录:D:\JAVA\Java File\src

// false
// 目录:D:\JAVA\Java File\class
// 目录:D:\JAVA\Java File\class_newDir
// 目录:D:\JAVA\Java File\history
// 目录:D:\JAVA\Java File\src