# Apache `FileUtils`教程

原文：http://zetcode.com/java/fileutils/

Apache `FileUtils`教程显示了如何使用 Apache `FileUtils`来处理 Java 中的文件和目录。 这些示例读取，写入，复制，创建，删除，列出文件并获取文件大小。

Apache `FileUtils`是常规的文件操作工具。 `FileUtils`是 Apache Commons IO 的一部分，Apache Commons IO 是一个工具库，可帮助开发 Java 中的 IO 功能。

```java
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

```

在示例中，我们使用`commons-io`依赖项。

## Apache `FileUtils`创建和删除文件

使用`FileUtils.touch()`创建一个新文件，并使用`FileUtils.deleteQuietly()`将其删除。

`CreateDeleteFileEx.java`

```java
package com.zetcode;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class CreateDeleteFileEx {

    public static void main(String[] args) throws IOException {

        File myfile = new File("src/main/resources/myfile.txt");        
        FileUtils.touch(myfile);

        if (myfile.exists()) {

            System.out.println("The file exists");
        } else {

            System.out.println("The file does not exist");
        }

        FileUtils.deleteQuietly(myfile);

        if (myfile.exists()) {

            System.out.println("The file exists");
        } else {

            System.out.println("The file does not exist");
        }        
    }
}

```

该示例创建一个新文件，检查其存在，将其删除，然后再次检查其存在。

```java
File myfile = new File("src/main/resources/myfile.txt");        
FileUtils.touch(myfile);

```

使用`FileUtils.touch()`创建一个新文件。

```java
if (myfile.exists()) {

```

我们使用`File`的`exists()`方法检查文件是否存在。

```java
FileUtils.deleteQuietly(myfile);

```

该文件用`FileUtils.deleteQuietly()`删除。

## Apache `FileUtils`复制文件

可以使用`FileUtils.copyFile()`和`FileUtils.copyFileToDirectory()`方法复制文件。 要比较文件内容，我们可以使用`FileUtils.contentEquals()`方法。

`CopyFileEx.java`

```java
package com.zetcode;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class CopyFileEx {

    public static void main(String[] args) throws IOException {

        File myfile1 = new File("src/main/resources/myfile.txt");
        File myfile2 = new File("src/main/resources/myfile2.txt");

        FileUtils.copyFile(myfile1, myfile2);

        if (FileUtils.contentEquals(myfile1, myfile2)) {

            System.out.println("The files have equal content");
        } else {

            System.out.println("The files do not have equal content");
        }

        File docs = new File("src/main/resources/docs");
        FileUtils.forceMkdir(docs);

        FileUtils.copyFileToDirectory(myfile2, docs);
    }
}

```

该示例将文件复制到同一目录中并比较它们的内容。 然后，它创建一个新目录并将文件复制到该新目录。

```java
FileUtils.copyFile(myfile1, myfile2);

```

我们使用`FileUtils.copyFile()`将文件复制到同一目录中。

```java
if (FileUtils.contentEquals(myfile1, myfile2)) {

```

我们用`FileUtils.contentEquals()`比较两个文件的内容。

```java
FileUtils.forceMkdir(docs);

```

使用`FileUtils.forceMkdir()`创建一个新目录。

```java
FileUtils.copyFileToDirectory(myfile2, docs);

```

使用`FileUtils.copyFileToDirectory()`将文件复制到新目录。

在下面的示例中，我们将 URL 资源复制到本地文件。

`CopyUrl2FileEx.java`

```java
package com.zetcode;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.FileUtils;

public class CopyUrl2FileEx {

    public static void main(String[] args) throws IOException {

        URL myurl = new URL("http://www.something.com");

        File myfile = new File("src/main/resources/something.html");

        FileUtils.copyURLToFile(myurl, myfile);

        String content = FileUtils.readFileToString(myfile, 
                StandardCharsets.UTF_8.name());

        System.out.println(content);
    }
}

```

该示例复制 HTML 页面并将其写入文件。

```java
URL myurl = new URL("http://www.something.com");

```

我们阅读了`www.something.com`网页的内容。

```java
File myfile = new File("src/main/resources/something.html");

```

页面的 HTML 内容将被写入`src/main/resources/something.html`文件。

```java
FileUtils.copyURLToFile(myurl, myfile);

```

我们使用`FileUtils.copyURLToFile()`将网页复制到本地文件。

```java
String content = FileUtils.readFileToString(myfile, 
        StandardCharsets.UTF_8.name());

System.out.println(content);

```

我们读取本地文件的内容并将其打印到控制台。

## Apache `FileUtils`获取文件大小

我们使用`FileUtils.sizeOf()`确定文件大小，并使用`FileUtils.sizeOfDirectory()`确定目录大小。

`GetFileSizeEx.java`

```java
package com.zetcode;

import java.io.File;
import org.apache.commons.io.FileUtils;

public class GetFileSizeEx {

    public static void main(String[] args) {

        File myfile = new File("/home/janbodnar/tmp/rotunda.jpg");

        long fileSizeB = FileUtils.sizeOf(myfile);
        System.out.printf("The size of file is: %d bytes\n", fileSizeB);

        File mydir = new File("/home/janbodnar/tmp");

        long dirSizeB = FileUtils.sizeOfDirectory(mydir);
        double dirSizeKB = (double) dirSizeB / FileUtils.ONE_KB;
        double dirSizeMB = (double) dirSizeB / FileUtils.ONE_MB;

        System.out.printf("The size of directory is: %d bytes\n", dirSizeB);
        System.out.printf("The size of file is: %.2f kilobytes\n", dirSizeKB);
        System.out.printf("The size of file is: %.2f megabytes\n", dirSizeMB);        
    }
}

```

在示例中，我们获得文件和目录的大小。

```java
double dirSizeKB = (double) dirSizeB / FileUtils.ONE_KB;
double dirSizeMB = (double) dirSizeB / FileUtils.ONE_MB;

```

我们使用`FileUtils.ONE_KB`和`FileUtils.ONE_MB`常数来计算大小（以千字节和兆字节为单位）。

## Apache `FileUtils`读取文件

可以使用`FileUtils.readFileToString()`将文件读取为字符串，或者使用`FileUtils.readLines()`将文件读取为字符串集合。

`words.txt`

```java
blue, tank, robot, planet, wisdom, cherry, 
chair, pen, keyboard, tree, forest, plant
sky, movie, white, colour, music, dog, cat

```

我们在`src/main/resources`目录中有此文本文件。

`ReadFileEx.java`

```java
package com.zetcode;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.apache.commons.io.FileUtils;

public class ReadFileEx {

    public static void main(String[] args) throws IOException {

        File myfile = new File("src/main/resources/words.txt");

        String contents = FileUtils.readFileToString(myfile, 
                StandardCharsets.UTF_8.name());

        System.out.println(contents);

        List<String> lines = FileUtils.readLines(myfile, 
                StandardCharsets.UTF_8.name());

        System.out.printf("There are %d lines in the file\n", lines.size());

        System.err.printf("The second line is: %s", lines.get(1));
    }
}

```

该示例将文本文件读入字符串和字符串列表。

```java
String contents = FileUtils.readFileToString(myfile, 
        StandardCharsets.UTF_8.name());

```

在`FileUtils.readFileToString()`方法的第二个参数中，我们指定文件编码类型。

## Apache `FileUtils`写入文件

使用`FileUtils.writeStringToFile()`将字符串写入文件，使用`FileUtils.writeLines()`将字符串写入字符串集合。

`WriteFileEx.java`

```java
package com.zetcode;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;

public class WriteFileEx {

    public static void main(String[] args) throws IOException {

        String string = "Today is a gloomy day.";
        File myfile = new File("src/main/resources/myfile.txt");

        FileUtils.writeStringToFile(myfile, string, 
                StandardCharsets.UTF_8.name());

        List<String> lines = new ArrayList<>();
        lines.add("A dark forest.");
        lines.add("A stray dog.");
        lines.add("A massive mountain.");

        File myfile2 = new File("src/main/resources/myfile2.txt");

        FileUtils.writeLines(myfile2, 
                StandardCharsets.UTF_8.name(), lines);
    }
}

```

该示例将一个字符串和一个字符串列表写入文件。

## Apache `FileUtils`列出文件

`FileUtils.listFiles()`方法根据选择的条件查找文件。

`ListFilesEx.java`

```java
package com.zetcode;

import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;

public class ListFilesEx {

    public static void main(String[] args) {

        File myDir = new File("/home/janbodnar/tmp");

        Collection<File> files = FileUtils.listFiles(myDir, 
                new String[] {"txt", "html"}, true);

        files.stream().forEach(System.out::println);
    }
}

```

在此示例中，我们使用`FileUtils.listFiles()`查找与`txt`或`html`扩展名匹配的文件。

```java
Collection<File> files = FileUtils.listFiles(myDir, 
        new String[] {"txt", "html"}, true);

```

第二个参数是扩展数组。 该文件必须与要选择的这些扩展名之一匹配。 第三个参数指定我们也在子目录中搜索文件。

下一个示例搜索与过滤器匹配的文件。

`ListFilesFilterEx.java`

```java
package com.zetcode;

import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;

public class ListFilesFilterEx {

    public static void main(String[] args) {

        File myDir = new File("/home/janbodnar/tmp");

        Collection<File> files = FileUtils.listFiles(myDir, 
                new WildcardFileFilter("*.txt", IOCase.SENSITIVE),
                new NotFileFilter(DirectoryFileFilter.DIRECTORY));

        files.stream().forEach(System.out::println);
    }
}

```

使用覆盖的`FileUtils.listFiles()`方法，我们搜索与通配符过滤器匹配的文件。

```java
Collection<File> files = FileUtils.listFiles(myDir, 
        new WildcardFileFilter("*.txt", IOCase.SENSITIVE),
        new NotFileFilter(DirectoryFileFilter.DIRECTORY));

```

该方法的第一个参数是要搜索的目录名称。第二个参数是文件过滤器，最后一个是目录过滤器。 我们使用`WildcardFileFilter`搜索与`*.txt`通配符匹配的文件，并禁用`NotFileFilter`搜索目录。

## Apache `FileUtils`获取目录

`FileUtils.getTempDirectoryPath()`返回到系统临时目录的路径，`FileUtils.getUserDirectoryPath()`返回到用户的主目录的路径。

`GetDirsEx.java`

```java
package com.zetcode;

import org.apache.commons.io.FileUtils;

public class GetDirsEx {

    public static void main(String[] args) {

        String tempDir = FileUtils.getTempDirectoryPath();
        System.out.println(tempDir);

        String userDir = FileUtils.getUserDirectoryPath();
        System.out.println(userDir);
    }
}

```

该示例检索并打印系统临时目录和用户目录。

在本教程中，我们使用 Apache `FileUtils`处理文件。 您可能也对相关教程感兴趣：[用 Java 创建文件](/java/createfile/)，[用 Java 复制文件](/java/copyfile/)， [Java 文件大小](/java/filesize/)，[用 Java 读取文本文件](/articles/javareadtext/) ，[用 Java 读写 ICO 图像](/articles/javaico/)， [Java Swing 教程](/tutorials/javaswingtutorial/)， [Java 教程](/lang/java/)，[用 Java 显示图像](/java/displayimage/)。