当前位置 : 首页 » 文章分类 :  开发  »  Apache-Commons-IO 使用笔记

Apache-Commons-IO 使用笔记

Apache-Commons-IO 使用笔记

Commons IO 官方站点
https://commons.apache.org/proper/commons-io/


FileUtils

文件列表

listFiles() 列出目录中的文件

重载1、列出目录 directory 及其子目录中的文件

public static Collection<File> listFiles(final File directory, final String[] extensions, final boolean recursive)

参数:
extensions 扩展名列表,非空的话则只列出指定扩展名的文件,例如 {"java","xml"}
recursive 为 true 时会搜索所有子目录

重载2、列出目录 directory 及其子目录中的文件,所有文件都会被 fileFilter 过滤。

public static Collection<File> listFiles(final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)

参数:
fileFilter 不可为空,如果不需要过滤,可以传入 TrueFileFilter.INSTANCE 读取所有文件。可以使用 FileFilterUtils 工具类构造文件过滤器。
dirFilter 可选参数。设为 null 时不会搜索子目录中的文件。传入 TrueFileFilter.INSTANCE 可搜索所有子目录。

例1、列出目录下的所有 jpg 文件

Collection<File> images = FileUtils.listFiles(new File("/home/data"), new String[] {"jpg"}, true);

例2、匹配 txt 结尾的文件。

Collection<File> listFiles = FileUtils.listFiles(
  new File("/home/data"),
  FileFilterUtils.suffixFileFilter("txt"),
  DirectoryFileFilter.INSTANCE);

读文件

readFileToByteArray() 读文件到字节数组

public static byte[] readFileToByteArray(final File file) throws IOException

内部会调用 IOUtils.toByteArray

readFileToString() 读取文件到字符串

public static String readFileToString(final File file, final Charset encoding) throws IOException
public static String readFileToString(final File file, final String encoding) throws IOException

内部调用 IOUtils.toString

readLines() 按行读取文件

public static List<String> readLines(final File file, final Charset encoding) throws IOException
public static List<String> readLines(final File file, final String encoding) throws IOException

内部调用 IOUtils.readLines


目录

forceMkdir() 创建目录

public static void forceMkdir(final File directory) throws IOException

入参 directory 代表一个目录
创建目录及必要的父目录。
如果同名的目录已存在,直接返回。
如果存在同名的文件(但不是目录),会抛出 IOException 异常。

forceMkdirParent() 创建文件的父目录

public static void forceMkdirParent(final File file) throws IOException

入参 file 代表一个文件,创建这个文件的父目录。
内部先 file.getParentFile() 获取父目录,再调用 forceMkdir 创建目录

checkDirectory() 检查file存在且是目录

private static void checkDirectory(final File directory)

检查入参 directory 存在且是一个目录。

cleanDirectory() 清空目录

public static void cleanDirectory(final File directory) throws IOException

清空目录中的内容,但不删除目录本身。


文件拷贝/移动

copyFileToDirectory() 拷贝文件到目录

public static void copyFileToDirectory(final File srcFile, final File destDir) throws IOException

拷贝文件到目录中,会保留文件日期(但不保证一定成功)。
如果目标目录不存在会自动创建目录。
如果已存在目标文件,会覆盖。


moveFile() 移动文件

public static void moveFile(final File srcFile, final File destFile) throws IOException

如果目标文件在不同的文件系统上,利用“拷贝并删除”来移动。


touch() 创建文件

public static void touch(final File file) throws IOException

类似 Unix 上的 touch 命令,创建一个空文件。
如果文件已存在,会更新文件时间。


写文件

writeStringToFile() 写入字符串到文件

public static void writeStringToFile(final File file, final String data, final String encoding) throws IOException
public static void writeStringToFile(final File file, final String data, final Charset encoding) throws IOException
public static void writeStringToFile(final File file, final String data, final String encoding, final boolean append) throws IOException
public static void writeStringToFile(final File file, final String data, final Charset encoding, final boolean append) throws IOException

写入字符串到文件,如果文件不存在会新建。
encoding 编码格式,传入 null 则会使用平台默认编码。
append 是否追加写入。true: 追加到末尾,false: 覆盖写入

copyInputStreamToFile() 流拷贝到文件

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("xxx.png");
File tempFile = File.createTempFile("temp", ".png");
FileUtils.copyInputStreamToFile(inputStream, tempFile);

FilenameUtils

getName() 获取文件名(无路径有扩展名)

public static String getName(final String filename)
a/b/c.txt --> c.txt
a.txt     --> a.txt
a/b/c     --> c
a/b/c/    --> ""

getBaseName() 获取基础名(无路径无扩展名)

public static String getBaseName(final String filename)

返回输入文件名的基础名(即去掉路径和扩展名),即返回最后一个斜线或反斜线与最后一个点.之间的文本。
可处理 Unix 或 Windows 格式的文件名。

a/b/c.txt --> c
a.txt     --> a
a/b/c     --> c
a/b/c/    --> ""

getExtension() 获取扩展名(不包含点)

public static String getExtension(final String filename)

返回输入文件名的扩展名,不包含点 ., 即返回最后一个点 . 之后的文本部分。

foo.txt      --> "txt"
a/b/c.jpg    --> "jpg"
a/b.txt/c    --> ""
a/b/c        --> ""

IOUtils

org.apache.commons.io.IOUtils

http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html

write(String, OutputStream)

IOUtils 写 String 到文件

@Test
public void writeFile() throws Exception {
    IOUtils.write(System.getProperties().toString(), new FileOutputStream(new File("/Users/si.ma/out-test.txt")));
}

IOUtils 追加写入文件

创建 FileOutputStream 时第二个参数 append=true 为追加写入

// 创建文件
File subDir = new File(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
File respJsonFile = new File(String.format("%s/resp.json", subDir.getAbsolutePath()));
FileOutputStream fileOutputStream = null;
try {
    fileOutputStream = new FileOutputStream(respJsonFile, true);
} catch (FileNotFoundException e) {
    log.info("create file {} fail", respJsonFile.getAbsolutePath());
}

// 追加写入 resp.json
for (UserInfo userInfo : resp.getData().getContent()) {
    try {
        IOUtils.write(JsonMappers.Normal.toPrettyJson(userInfo), fileOutputStream,
                StandardCharsets.UTF_8);
    } catch (Exception e) {
        log.error("save resp to file error", e);
    }
}

readLines()

IOUtils 按行读文件并输出

@Test
public void readClasspathFile() throws Exception {
    InputStream inputStream = new FileInputStream(new File("in.txt"));
    IOUtils.readLines(inputStream).forEach(System.out::println);
}

toString() 读文本文件到string

try (
    InputStream inputStream = new FileInputStream("/Users/xxx/Downloads/xx.json");
) {
    String json = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
} catch (Exception e) {
    log.error("read file error");
}

writeLines()

IOUtils 按行读写文件:

@Test
public void readAndwriteFile() throws Exception {
    InputStream inputStream = new FileInputStream(new File("/Users/si.ma/file.txt"));
    OutputStream outputStream = new FileOutputStream(new File("/Users/si.ma/out.txt"));
    IOUtils.writeLines(IOUtils.readLines(inputStream), null, outputStream);
}

readLines 第二个参数是换行符,如果为 null 则使用系统默认换行符


copy()

copy(inputstream,outputstream)
copy(inputstream,writer)
copy(inputstream,writer,encoding)
copy(reader,outputstream)
copy(reader,writer)
copy(reader,writer,encoding)

copy内部使用的其实还是copyLarge方法。copy能拷贝Integer.MAX_VALUE的字节数据,即2^31-1。

IOUtils 拷贝文件实例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;

public class TestFile {
    public static void main(String... args) throws IOException {
        File inputFile = new File("/tmp/data_20190316_1.xlsx");
        File outputFile = new File("/tmp/output.xlsx");
        if (inputFile != null && inputFile.exists() && inputFile.isFile()) {
            InputStream inputStream = new FileInputStream(inputFile);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IOUtils.copy(inputStream, outputStream);
            outputStream.close();
            inputStream.close();
        }
    }
}

copyLarge()

这个方法适合拷贝较大的数据流,比如2G以上。

从一个大 InputStream 拷贝数据到 OutputStream,内置缓冲区(默认4096 bytes,也可以通过第三个参数指定 buffer),所以没必要使用 BufferedInputStream

public static long copyLarge(final InputStream input, final OutputStream output) throws IOException
public static long copyLarge(final InputStream input, final OutputStream output, final byte[] buffer) throws IOException

toByteArray(URL)

Java下载图片最简单的方式

下载图片为 byte[]

byte[] image = IOUtils.toByteArray(new URL(imageUrl));

上一篇 Spring-Cloud-OpenFeign

下一篇 Spring-Cloud-Sleuth

阅读
评论
1.7k
阅读预计8分钟
创建日期 2019-03-19
修改日期 2023-06-13
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论