专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java File类的详细介绍

Java File类的详细介绍

更新时间:2022-06-13 10:58:47 来源:动力节点 浏览1109次

在本教程中,动力节点小编将进行Java File类概述,它是java.io API 的一部分。 File类使我们能够处理文件系统上的文件和目录。

1.创建文件对象

File 类 有 4 个公共构造函数。根据开发者的需要,可以创建不同类型的File类实例。

File(String pathname) – 创建一个代表给定路径名的实例

File(String parent, String child) – 创建一个实例,表示通过连接 父路径和 子路径形成的路径

File(File parent, String child) – 创建一个实例,其路径由另一个 File 实例表示的父路径和子路径连接而成

File(URI uri) – 创建一个代表给定统一资源标识符的实例

2.使用文件类

File类 有许多方法允许我们使用和操作文件系统上的文件。我们将在这里重点介绍其中的一些。重要的是要注意File类不能修改或访问它所代表的文件的内容。

(1)创建和删除目录和文件

File类具有创建和删除目录和文件的 实例方法。目录和文件分别使用mkdir和createNewFile方法创建。

使用 删除方法删除目录和文件。所有这些方法都返回一个布尔值,当操作成功时为真,否则为假:

@Test
public void givenDir_whenMkdir_thenDirIsDeleted() {
    File directory = new File("dir");
    assertTrue(directory.mkdir());
    assertTrue(directory.delete());
}
@Test
public void givenFile_whenCreateNewFile_thenFileIsDeleted() {
    File file = new File("file.txt");
    try {
        assertTrue(file.createNewFile());
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    assertTrue(file.delete());
}

在上面的代码片段中,我们还看到了其他有用的方法。

isDirectory方法可用于测试提供的名称表示的文件是否为目录,而isFile方法可用于测试提供的名称表示的文件是否为文件。并且,我们可以使用exists方法 来测试一个目录或文件是否已经存在于系统中。

(2)获取有关文件实例的元数据

File 类有许多返回有关File 实例的元数据的 方法。让我们看看如何使用getName、getParentFile和 getPath方法:

@Test
public void givenFile_whenCreateNewFile_thenMetadataIsCorrect() {
    String sep = File.separator;
    File parentDir = makeDir("filesDir");
    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    assertEquals("file.txt", child.getName());
    assertEquals(parentDir.getName(), child.getParentFile().getName());
    assertEquals(parentDir.getPath() + sep + "file.txt", child.getPath());
    removeDir(parentDir);
}

在这里,我们演示了验证有关在目录中创建的文件的元数据。我们还展示了如何找到文件的父级以及该文件的相对路径。

(3)设置文件和目录权限

File 类具有允许您设置文件或目录权限的方法。 在这里,我们将看看setWritable和setReadable 方法:

@Test
public void givenReadOnlyFile_whenCreateNewFile_thenCantModFile() {
    File parentDir = makeDir("readDir");
    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    child.setWritable(false);
    boolean writable = true;
    try (FileOutputStream fos = new FileOutputStream(child)) {
        fos.write("Hello World".getBytes()); // write operation
        fos.flush();
    } catch (IOException e) {
        writable = false;
    } finally {
        removeDir(parentDir);
    }
    assertFalse(writable);
}

在上面的代码中,我们在显式设置阻止任何写入的权限后尝试写入文件。我们使用setWritable方法来做到这一点。不允许在写入文件时尝试写入文件会导致抛出IOException。

接下来,我们在设置阻止任何读取的权限后尝试从文件中读取。使用setReadable方法阻止读取:

@Test
public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() {
    File parentDir = makeDir("writeDir");
    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    child.setReadable(false);
    boolean readable = true;
    try (FileInputStream fis = new FileInputStream(child)) {
        fis.read(); // read operation
    } catch (IOException e) {
        readable = false;
    } finally {
        removeDir(parentDir);
    }
    assertFalse(readable);
}

同样,JVM 将在尝试读取不允许读取的文件时抛出IOException。

(4)列出目录中的文件

File 类具有允许我们列出目录中包含的文件的方法。 同样,也可以列出目录。在这里,我们将看看list和 list(FilenameFilter)方法:

@Test
public void givenFilesInDir_whenCreateNewFile_thenCanListFiles() {
    File parentDir = makeDir("filtersDir");
    String[] files = {"file1.csv", "file2.txt"};
    for (String file : files) {
        try {
            new File(parentDir, file).createNewFile();
        } catch (IOException e) {
            fail("Could not create " + file);
        }
    }
    //normal listing
    assertEquals(2, parentDir.list().length);
    //filtered listing
    FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv");
    assertEquals(1, parentDir.list(csvFilter).length);
    removeDir(parentDir);
}

我们创建了一个目录并向其中添加了两个文件——一个带有csv 扩展名,另一个带有 txt 扩展名。当列出目录中的所有文件时,我们得到了预期的两个文件。当我们通过过滤带有csv扩展名的文件来过滤列表时,我们只返回一个文件。

(5)重命名文件和目录

File类具有使用renameTo 方法重命名文件和目录的 功能:

@Test
public void givenDir_whenMkdir_thenCanRenameDir() {
    File source = makeDir("source");
    File destination = makeDir("destination");
    boolean renamed = source.renameTo(destination);
    if (renamed) {
        assertFalse(source.isDirectory());
        assertTrue(destination.isDirectory());
        removeDir(destination);
    }
}

在上面的示例中,我们创建了两个目录——源目录和目标目录。然后我们使用renameTo方法将源目录重命名为目标目录。同样可以用来重命名文件而不是目录。

(6)获取磁盘空间信息

File 类 还允许我们获取磁盘空间信息。让我们看一下getFreeSpace方法的演示:

@Test
public void givenDataWritten_whenWrite_thenFreeSpaceReduces() {
    String home = System.getProperty("user.home");
    String sep = File.separator;
    File testDir = makeDir(home + sep + "test");
    File sample = new File(testDir, "sample.txt");
    long freeSpaceBefore = testDir.getFreeSpace();
    try {
        writeSampleDataToFile(sample);
    } catch (IOException e) {
        fail("Could not write to " + "sample.txt");
    }
    long freeSpaceAfter = testDir.getFreeSpace();
    assertTrue(freeSpaceAfter < freeSpaceBefore);
    removeDir(testDir);
}

在此示例中,我们在用户的主目录中创建了一个目录,然后在其中创建了一个文件。然后我们检查了在用一些文本填充这个文件后主目录分区上的可用空间是否发生了变化。提供有关磁盘空间信息的其他方法是getTotalSpace和 getUsableSpace。如果大家想了解更多相关知识,可以关注一下动力节点的Java基础教程,里面有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>