Apache FileUtils
最后修改于 2024 年 1 月 27 日
Apache FileUtils 教程展示了如何在 Java 中使用 Apache FileUtils 来处理文件和目录。 示例包括读取、写入、复制、创建、删除、列出文件以及获取文件大小。
Apache FileUtils 是一般的的文件操作实用程序。 FileUtils 是 Apache Commons IO 的一部分,Apache Commons IO 是一个用于辅助开发 Java 中 IO 功能的实用程序库。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
在示例中,我们使用 commons-io 依赖项。
Apache FileUtils 创建和删除文件
使用 FileUtils.touch 创建一个新文件,并使用 FileUtils.deleteQuietly 删除该文件。
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");
}
}
}
该示例创建一个新文件,检查其是否存在,删除该文件,然后再次检查其是否存在。
File myfile = new File("src/main/resources/myfile.txt");
FileUtils.touch(myfile);
使用 FileUtils.touch 创建一个新文件。
if (myfile.exists()) {
我们使用 File 的 exists 方法检查文件是否存在。
FileUtils.deleteQuietly(myfile);
使用 FileUtils.deleteQuietly 删除该文件。
Apache FileUtils 复制文件
可以使用 FileUtils.copyFile 和 FileUtils.copyFileToDirectory 方法复制文件。 要比较文件内容,我们可以使用 FileUtils.contentEquals 方法。
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);
}
}
该示例在同一目录中复制一个文件并比较它们的内容。 然后,它创建一个新目录并将文件复制到此新目录。
FileUtils.copyFile(myfile1, myfile2);
我们使用 FileUtils.copyFile 在同一目录中复制文件。
if (FileUtils.contentEquals(myfile1, myfile2)) {
我们使用 FileUtils.contentEquals 比较两个文件的内容。
FileUtils.forceMkdir(docs);
使用 FileUtils.forceMkdir 创建一个新目录。
FileUtils.copyFileToDirectory(myfile2, docs);
使用 FileUtils.copyFileToDirectory 将文件复制到新目录。
在以下示例中,我们将 URL 资源复制到本地文件。
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 页面并将其写入文件。
URL myurl = new URL("http://www.something.com");
我们读取 www.something.com 网页的内容。
File myfile = new File("src/main/resources/something.html");
页面的 HTML 内容将被写入 src/main/resources/something.html 文件。
FileUtils.copyURLToFile(myurl, myfile);
我们使用 FileUtils.copyURLToFile 将网页复制到本地文件。
String content = FileUtils.readFileToString(myfile,
StandardCharsets.UTF_8.name());
System.out.println(content);
我们读取本地文件的内容并将其打印到控制台。
Apache FileUtils 获取文件大小
我们使用 FileUtils.sizeOf 确定文件大小,并使用 FileUtils.sizeOfDirectory 确定目录大小。
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);
}
}
在该示例中,我们获取文件和目录的大小。
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 读取到字符串集合中。
blue, tank, robot, planet, wisdom, cherry, chair, pen, keyboard, tree, forest, plant sky, movie, white, colour, music, dog, cat
我们在 src/main/resources 目录中有一个文本文件。
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));
}
}
该示例将文本文件读取到字符串和字符串列表中。
String contents = FileUtils.readFileToString(myfile,
StandardCharsets.UTF_8.name());
在 FileUtils.readFileToString 方法的第二个参数中,我们指定文件编码类型。
Apache FileUtils 写入文件
使用 FileUtils.writeStringToFile 将字符串写入文件,并使用 FileUtils.writeLines 将字符串集合写入文件。
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 方法根据选定的条件查找文件。
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 扩展名匹配的文件。
Collection<File> files = FileUtils.listFiles(myDir,
new String[] {"txt", "html"}, true);
第二个参数是扩展名数组; 文件必须与其中一个扩展名匹配才能被选中。 第三个参数指定我们也搜索子目录中的文件。
下一个示例搜索与过滤器匹配的文件。
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 方法,我们搜索与通配符过滤器匹配的文件。
Collection<File> files = FileUtils.listFiles(myDir,
new WildcardFileFilter("*.txt", IOCase.SENSITIVE),
new NotFileFilter(DirectoryFileFilter.DIRECTORY));
该方法的第一个参数是要搜索的目录名称。 第二个参数是文件过滤器,最后一个参数是目录过滤器。 我们使用 WildcardFileFilter 搜索与 *.txt 通配符匹配的文件,并使用 NotFileFilter 禁用搜索目录。
Apache FileUtils 获取目录
FileUtils.getTempDirectoryPath 返回系统临时目录的路径,FileUtils.getUserDirectoryPath 返回用户主目录的路径。
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教程。