The Java File Class – Java文件类

最后修改: 2019年 10月 8日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this tutorial, we’ll give an overview of the File class, which is part of the java.io API. The File class gives us the ability to work with files and directories on the file system.

在本教程中,我们将对File类进行概述,它是java.ioAPI的一部分。File类使我们有能力处理文件系统中的文件和目录

2. Creating a File Object

2.创建一个文件对象

The File class has 4 public constructors. Depending on the developer’s needs, different types of instances of the File class can be created.

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

  • File(String pathname) – Creates an instance representing the given pathname
  • File(String parent, String child) – Creates an instance that represents the path formed by joining the parent and the child paths
  • File(File parent, String child) – Creates an instance with the path formed by joining the parent path represented by another File instance and the child path
  • File(URI uri) – Creates an instance that represents the given Uniform Resource Identifier

3. Working with the File Class

3.使用文件类工作

The File class has a number of methods that allow us to work with and manipulate files on the file system. We will highlight some of them here. It is important to note that the File class cannot modify or access the contents of the file it represents.

文件类有许多方法,允许我们在文件系统上处理和操作文件。我们将在此强调其中的一些。需要注意的是,文件类不能修改或访问它所代表的文件的内容。

3.1. Creating and Deleting Directories and Files

3.1.创建和删除目录和文件

The File class has instance methods to create and delete directories and files. Directories and files are created using the mkdir and createNewFile methods, respectively.

文件类有一些实例方法来创建和删除目录和文件。目录和文件分别使用mkdircreateNewFile方法来创建。

Directories and files are deleted using the delete method. All these methods return a boolean value that is true when the operation succeeds, and false otherwise:

目录和文件是使用delete方法删除的。所有这些方法都返回一个boolean值,当操作成功时为true,否则为false

@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());
}

In the above snippet, we also see other helpful methods.

在上述片段中,我们还看到其他有用的方法

The isDirectory method can be used to test if the file denoted by the provided name is a directory, while the isFile method can be used to test if the file denoted by the provided name is a file. And, we can use the exists method to test whether a directory or file already exists on the system.

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

3.2. Getting Metadata About File Instances

3.2.获取关于文件实例的元数据

The File class has a number of methods that return metadata about File instances. Let’s see how to use the getName, getParentFile, and getPath methods:

文件类有许多方法可以返回关于文件实例的元数据。让我们看看如何使用 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);
}

Here, we’ve illustrated validating the metadata about the file that was created inside the directory. We’ve also shown how to find the parent of the file and the relative path to that file.

在这里,我们已经说明了验证在目录中创建的文件的元数据。我们还展示了如何找到文件的父级和该文件的相对路径。

3.3. Setting File and Directory Permissions

3.3.设置文件和目录的权限

The File class has methods that allow you to set permissions on a file or a directory. Here, we’ll look at the setWritable and setReadable methods:

文件类有一些方法,允许你设置文件或目录的权限。在这里,我们将看看setWritablesetReadable 方法

@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);
}

In the code above, we attempt to write to a file after we explicitly set permissions on it that blocks any writes. We do this with the setWritable method. Attempting to write to a file when writing to the file is not permitted results in a IOException being thrown.

在上面的代码中,我们在明确设置了阻止任何写入的权限后,试图向一个文件写入。我们通过setWritable方法来做到这一点。在不允许向文件写入的情况下尝试向该文件写入会导致抛出一个IOException

Next, we attempt to read from a file after setting permissions on it that blocks any reads. Reads are blocked using the setReadable method:

接下来,我们在设置了阻止任何读取的权限后,试图从一个文件中读取。使用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);
}

Again, the JVM will throw a IOException for attempts to read a file where reads are not permitted.

同样,JVM将抛出一个IOException ,以试图读取一个不允许读取的文件

3.4. Listing Files Inside a Directory

3.4.在一个目录中列出文件

The File class has methods that allow us to list files contained in a directory. Similarly, directories can also be listed. Here we’ll look at the list and list(FilenameFilter) methods:

文件类有一些方法,允许我们列出包含在一个目录中的文件。同样地,目录也可以被列出。这里我们将看看listlist(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);
}

We created a directory and added two files to it — one with a csv extension and the other with a txt extension. When listing all files in the directory, we get two files as expected. When we filter the listing by filtering around files with a csv extension, we get only one file returned.

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

3.5. Renaming Files and Directories

3.5.重命名文件和目录

The File class has the functionality of renaming files and directories using the renameTo method:

文件类具有重命名文件和目录的功能使用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);
    }
}

In the example above, we create two directories — the source and the destination directories. We then rename the source directory to the destination directory using the renameTo method. The same can be used to rename files instead of directories.

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

3.6. Getting Disk Space Information

3.6.获取磁盘空间信息

The File class also allows us to get disk space information. Let’s see a demonstration of the getFreeSpace method:

文件类也允许我们获得磁盘空间信息。让我们看看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);
}

In this example, we created a directory inside the user’s home directory and then created a file in it. We then checked if the free space on the home directory partition had changed after populating this file with some text. Other methods that give information about disk space are getTotalSpace and getUsableSpace.

在这个例子中,我们在用户的主目录中创建了一个目录,然后在其中创建了一个文件。然后我们在给这个文件填充一些文本后,检查主目录分区的可用空间是否有变化。其他提供磁盘空间信息的方法是getTotalSpacegetUsableSpace

4. Conclusion

4.总结

In this tutorial, we’ve shown some of the functionality the File class provides for working with files and directories on the file system. .

在本教程中,我们展示了File类为处理文件系统中的文件和目录提供的一些功能。.

As always, the full source code of the example is available over on Github.

一如既往,该示例的完整源代码可在Github上获取over