java中的File类_FileFilter过滤器_RandomAccessFile随机访问文件类

本文详细介绍了Java中File类的使用方法,包括文件和文件夹的基本操作如创建、删除、重命名等,以及如何获取文件信息。同时,还介绍了如何利用File类进行文件过滤,筛选特定类型的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 对于UNIX平台,绝对路径名的前缀始终为"/" 。 相对路径名没有前缀。 表示根目录的抽象路径名具有前缀"/"和空名称序列。
  • 对于Microsoft Windows平台,包含驱动器盘符的路径名的前缀由后面跟着":“的驱动器号组成,文件夹分隔符可以是”/“也可以是”\\"(转义字符)。

创建FIle对象

package pc;

import java.io.File;
import java.io.IOException;

public class demo1 {
    public static void main(String[] args) {
        File file0 = new File("a.txt");   // 可以用createNewFile()直接创建文件
        File file1 = new File("e:\\dir");   // 可以用mkdir()直接创建文件夹
        File file2 = new File("e:/dir/a/txt");  // 需要有dir这个目录才可以用createNewFile()创建文件 下同
        File file3 = new File("dir");
        File file4 = new File("dir/a.txt");
        File file5 = new File("dir/dir1/dir2");  // 若有不存在的父目录,必须用mkdirs()
        File file6 = new File(file3, "b.txt");
        File file7 = new File(file3, "dirs");
        File file8 = new File("dir", "c.txt");
    }
}
    • Constructor and Description
      File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
      File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
      File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
      File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。
  • File类既可以对文件操作,也可以对文件夹操作

文件操作

  • 判断文件是否存在、创建文件、重命名文件、删除文件、获取文件信息(名称,大小、修改时间、是否隐藏)等
package pc;

import java.io.File;
import java.io.IOException;

public class demo2 {
    public static void main(String[] args) {
        File file0 = new File("a.txt");

        System.out.println(file0.exists());
        try {
            file0.createNewFile();
            System.out.println("创建文件夹");
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("\n============================");
        System.out.println(file0.canExecute());
        System.out.println(file0.canRead());
        System.out.println(file0.canWrite());
        System.out.println("============================\n");

        // 对比File("a.txt") 和 File("绝对路径")的区别
        File absoluteFile = file0.getAbsoluteFile();   // 获得绝对路径名形式

        System.out.println("file0:");
        System.out.println(file0.getAbsolutePath());
        System.out.println(file0.getName());
        System.out.println(file0.getParent());
        System.out.println(file0.getPath());


        System.out.println("\n absoluteFile:");
        System.out.println(absoluteFile.getAbsolutePath());
        System.out.println(absoluteFile.getName());
        System.out.println(absoluteFile.getParent());
        System.out.println(absoluteFile.getPath());
        System.out.println("============================\n");



        System.out.println(file0.getFreeSpace());
        System.out.println(file0.getTotalSpace());
        System.out.println(file0.length());
        System.out.println(file0.isFile());
        System.out.println(file0.isHidden());
        System.out.println(file0.lastModified());

        file0.renameTo(new File("aa.txt"));
        System.out.println(file0.getAbsolutePath());

//        file0.setLastModified()

        file0.setReadOnly();
        System.out.println(file0.canWrite());

        System.out.println(file0.toURI());
    }
}
/*
结果:
false
创建文件夹

============================
true
true
true
============================

file0:
D:\programme\Git\sweet-xia\java\File\a.txt
a.txt
null
a.txt

absoluteFile:
D:\programme\Git\sweet-xia\java\File\a.txt
a.txt
D:\programme\Git\sweet-xia\java\File
D:\programme\Git\sweet-xia\java\File\a.txt
============================

244320161792
785319456768
0
true
false
1637386283928
D:\programme\Git\sweet-xia\java\File\a.txt
false
file:/D:/programme/Git/sweet-xia/java/File/a.txt

Process finished with exit code 0

 */
  • isFile() 是判断是否是文件
  • isDirector() 判断是否是文件夹

另一个创建文件夹的方法 createTempFile

package pc;

import java.io.File;
import java.io.IOException;

public class demo2_1 {
    public static void main(String[] args) {
        File dir = new File("dir");
        try {
            File.createTempFile("cccc", ".txt", dir); // 前缀太短会报错 后缀包括'.'
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • createTempFile(String prefix, String suffix, File directory) 如果directory参数是null那么将使用系统相关的默认临时文件目录。 默认临时文件目录由系统属性java.io.tmpdir 。 在UNIX系统上,此属性的默认值通常为"/tmp"或"/var/tmp" ; 在Microsoft Windows系统上,通常是"C:\WINNT\TEMP"

文件夹操作

  • 判断文件夹是否存在、创建文件夹、删除文件夹、获取文件夹的子文件夹及文件等
package pc;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class demo3 {
    public static void main(String[] args) {
        File file3 = new File("dir");
        File file4 = new File("dir/a.txt");
        File file5 = new File("dir/dir1/dir2");
        File file6 = new File(file3, "b.txt");
        File file7 = new File(file3, "dirs");
        File file8 = new File("dir", "c.txt");

        file3.mkdir();
        file5.mkdirs();

        // 创建更多文件和文件夹,使dir文件夹中的内容更多,便于下面方法的测试
        file7.mkdir();
        try {
            file4.createNewFile();
            file6.createNewFile();
            file8.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(file3.isDirectory());
        System.out.println(file3.isHidden());
        
        String[] str = file3.list();
        File[] files = file3.listFiles();
        System.out.println(Arrays.toString(str));
        System.out.println(Arrays.toString(files));
        // 带过滤器参数的list()方法和listFiles()方法在下面介绍
    }
}

/*
结果:
true
false
[a.txt, b.txt, c.txt, dir1, dirs]
[dir\a.txt, dir\b.txt, dir\c.txt, dir\dir1, dir\dirs]
 */
    • Modifier and TypeMethod and Description
      booleancanExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。
      booleancanRead() 测试应用程序是否可以读取由此抽象路径名表示的文件。
      booleancanWrite() 测试应用程序是否可以修改由此抽象路径名表示的文件。
      intcompareTo(File pathname) 比较两个抽象的路径名字典。
      booleancreateNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
      static FilecreateTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。
      static FilecreateTempFile(String prefix, String suffix, File directory) 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
      booleandelete() 删除由此抽象路径名表示的文件或目录。
      voiddeleteOnExit() 请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。
      booleanequals(Object obj) 测试此抽象路径名与给定对象的相等性。
      booleanexists() 测试此抽象路径名表示的文件或目录是否存在。
      FilegetAbsoluteFile() 返回此抽象路径名的绝对形式。
      StringgetAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
      FilegetCanonicalFile() 返回此抽象路径名的规范形式。
      StringgetCanonicalPath() 返回此抽象路径名的规范路径名字符串。
      longgetFreeSpace() 返回分区未分配的字节数 named此抽象路径名。
      StringgetName() 返回由此抽象路径名表示的文件或目录的名称。
      StringgetParent() 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。
      FilegetParentFile() 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
      StringgetPath() 将此抽象路径名转换为路径名字符串。
      longgetTotalSpace() 通过此抽象路径名返回分区 named的大小。
      longgetUsableSpace() 返回上的分区提供给该虚拟机的字节数 named此抽象路径名。
      inthashCode() 计算此抽象路径名的哈希码。
      booleanisAbsolute() 测试这个抽象路径名是否是绝对的。
      booleanisDirectory() 测试此抽象路径名表示的文件是否为目录。
      booleanisFile() 测试此抽象路径名表示的文件是否为普通文件。
      booleanisHidden() 测试此抽象路径名命名的文件是否为隐藏文件。
      longlastModified() 返回此抽象路径名表示的文件上次修改的时间。
      longlength() 返回由此抽象路径名表示的文件的长度。(以字节为单位)
      String[]list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
      String[]list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
      File[]listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
      File[]listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
      File[]listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
      static File[]listRoots() 列出可用的文件系统根。
      booleanmkdir() 创建由此抽象路径名命名的目录。
      booleanmkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
      booleanrenameTo(File dest) 重命名由此抽象路径名表示的文件。
      booleansetExecutable(boolean executable) 为此抽象路径名设置所有者的执行权限的便利方法。
      booleansetExecutable(boolean executable, boolean ownerOnly) 设置该抽象路径名的所有者或每个人的执行权限。
      booleansetLastModified(long time) 设置由此抽象路径名命名的文件或目录的最后修改时间。
      booleansetReadable(boolean readable) 一种方便的方法来设置所有者对此抽象路径名的读取权限。
      booleansetReadable(boolean readable, boolean ownerOnly) 设置此抽象路径名的所有者或每个人的读取权限。
      booleansetReadOnly() 标记由此抽象路径名命名的文件或目录,以便只允许读取操作。
      booleansetWritable(boolean writable) 一种方便的方法来设置所有者对此抽象路径名的写入权限。
      booleansetWritable(boolean writable, boolean ownerOnly) 设置此抽象路径名的所有者或每个人的写入权限。
      PathtoPath() 返回从此抽象路径构造的对象。
      StringtoString() 返回此抽象路径名的路径名字符串。
      URItoURI() 构造一个表示此抽象路径名的 file: URI。

FilenameFilter接口

  • 用于实现此接口的类的实例用于过滤文件名。
  • 这是一个功能界面,因此可以用作lambda表达式或方法引用的赋值对象。 (只有一个抽象方法)

例:查找"D:\someFiles"下所有以.jpg结尾的文件名

package pc;

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

public class demo4 {
    public static void main(String[] args) {
        File file = new File("D:\\someFiles");

        String[] str = file.list(((dir, name) -> name.endsWith(".jpg")));

        for (String s : str) {
            System.out.println(s);
        }
    }
}

FileFilter接口

  • 抽象路径名的过滤器。

  • 和FilenameFilter一样只有一个抽象方法,可以使用lambda表达式和方法引用

  • 本例中的参数pathname是"D:\someFiles"下所有文件的File对象

  • dir、name、pathname的关系是:pathname.getName()==name;pathname.getParentFile()==dir

    • Modifier and TypeMethod and Description
      booleanaccept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
package pc;

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

public class demo5 {
    public static void main(String[] args) {
        File file = new File("D:\\someFiles");

        // 效果和上面那个例子类似 查找"D:\someFiles"下所有以.jpg结尾的文件
        File[] files1 = file.listFiles(pathname -> pathname.getName().endsWith(".jpg"));

        for (File file1 : files1) {
            System.out.println(file1);  // File的toString()方法调用的是getPath()方法
        }

        // 找到"D:\someFiles"下所有的文件
        File[] files2 = file.listFiles(pathname -> pathname.isFile());

        for (File file1 : files2) {
            System.out.println(file1);
        }
    }
}

RandomAccessFile 随机访问文件类

  • 支持对随机存储文件的读取和写入。
package pc;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class TestRandomAccessFile {
    public static void main(String[] args) {
        try {
            RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
            for (int i = 0; i < 5; i++) {
                raf.writeInt(i);
            }
            raf.seek(0);   // 将指针定位到文件头部
            for (int i = 0; i < 5; i++) {
                System.out.println(raf.readInt());
            }
            raf.close();
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
    • Constructor and Description
      RandomAccessFile(File file, String mode) 创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。
      RandomAccessFile(String name, String mode) 创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。
  • 参数mode 是模式,“r” 为只读,“rw” 为可读可写,"rwd"模式可用于减少执行的I / O操作数。 使用"rwd"只需要更新要写入存储的文件内容; 使用"rws"需要更新要写入的文件的内容及其元数据,这通常需要至少一个低级I / O操作。

    • Modifier and TypeMethod and Description
      voidclose() 关闭此随机访问文件流并释放与流相关联的任何系统资源。
      FileChannelgetChannel() 返回与此文件关联的唯一的FileChannel对象。
      FileDescriptorgetFD() 返回与此流关联的不透明文件描述符对象。
      longgetFilePointer() 返回此文件中的当前偏移量。
      longlength() 返回此文件的长度。
      intread() 从该文件读取一个字节的数据。
      intread(byte[] b) 从该文件读取最多 b.length字节的数据到字节数组。
      intread(byte[] b, int off, int len) 从该文件读取最多 len个字节的数据到字节数组。
      booleanreadBoolean() 从此文件读取一个 boolean 。
      bytereadByte() 从此文件中读取一个带符号的八位值。
      charreadChar() 从此文件中读取一个字符。
      doublereadDouble() 从此文件读取 double 。
      floatreadFloat() 从此文件读取一个 float 。
      voidreadFully(byte[] b) 从此文件读取 b.length字节到字节数组,从当前文件指针开始。
      voidreadFully(byte[] b, int off, int len) 从此文件中读取 len个字节到字节数组,从当前文件指针开始。
      intreadInt() 从该文件读取一个带符号的32位整数。
      StringreadLine() 从此文件中读取下一行文本。
      longreadLong() 从该文件中读取一个带符号的64位整数。
      shortreadShort() 从此文件中读取一个已签名的16位数字。
      intreadUnsignedByte() 从此文件中读取一个无符号的八位数字。
      intreadUnsignedShort() 从该文件中读取一个无符号的16位数字。
      StringreadUTF() 从该文件读取字符串。
      voidseek(long pos) 设置文件指针偏移,从该文件的开头测量,发生下一次读取或写入。
      voidsetLength(long newLength) 设置此文件的长度。
      intskipBytes(int n) 尝试跳过 n字节的输入丢弃跳过的字节。
      voidwrite(byte[] b) 从指定的字节数组写入 b.length个字节到该文件,从当前文件指针开始。
      voidwrite(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移量 off开始写入此文件。
      voidwrite(int b) 将指定的字节写入此文件。
      voidwriteBoolean(boolean v) 将 boolean写入文件作为一个字节值。
      voidwriteByte(int v) 将 byte写入文件作为单字节值。
      voidwriteBytes(String s) 将字符串作为字节序列写入文件。
      voidwriteChar(int v) 将 char写入文件作为两字节值,高字节为先。
      voidwriteChars(String s) 将一个字符串作为字符序列写入文件。
      voidwriteDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值到该文件作为一个八字节的数量,高字节。
      voidwriteFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值到该文件作为一个四字节数量,高字节。
      voidwriteInt(int v) 将 int写入文件为四个字节,高字节 int 。
      voidwriteLong(long v) 将 long写入文件为八个字节,高字节为先。
      voidwriteShort(int v) 将 short写入文件作为两个字节,高字节优先。
      voidwriteUTF(String str) 以机器无关的方式使用UTF-8编码将字符串写入文件。

表格内容摘自java api文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

臭屁虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值