Guava: Files 文件工具类

发布时间:2024年01月12日

接口方法说明

方法名称方法描述
append(CharSequence from, File to, Charset charset)?已过时。使用 asCharSink(to, charset, FileWriteMode.APPEND).write(from),计划于2019年1月删除.
asByteSink(File file, FileWriteMode... modes)?返回一个新的ByteSink,用于将字节写入给定文件.
asByteSource(File file)?返回一个新的ByteSource,用于从给定文件中读取字节.
asCharSink(File file, Charset charset, FileWriteMode... modes)?返回一个新的CharSink,用于使用给定的字符集将字符数据写入给定文件.
asCharSource(File file, Charset charset)?返回一个新的CharSource,用于使用给定的字符集从给定文件中读取字符数据.
copy(File from, Charset charset, Appendable to)?已过时。使用 asCharSource(from, charset).copyTo(to). 计划于2019年1月删除.
copy(File from, File to)?将所有字节从一个文件复制到另一个文件.
copy(File from, OutputStream to)?将文件中的所有字节复制到输出流.
createParentDirs(File file)?需要注意的,如果最终创建失败,不能保证的是没有任何文件夹创建,也许在他的父目录路径上已经有某些文件夹被创建了.
createTempDir()?自动在系统的临时文件目录下创建一个新的目录,并返回他的名字。
equal(File file1, File file2)?比较两个文件中是否包含相等的字节数,如果相等返回true,否则返回false.
fileTraverser()?返回文件和目录树的Traverser实例.
getFileExtension(String fullName)?返回一个文件名的扩展名,如果一个文件没有扩展名,他将会返回一个空字符串.
getNameWithoutExtension(String file)?返回没有文件扩展名或路径的文件名.
hash(File file, HashFunction hashFunction)?已过时。使用 asByteSource(file).hash(hashFunction). 计划于2019年1月删除.
isDirectory()?返回一个predicate,内容是 File.isDirectory().
isFile()?返回一个 predicate,内容是 File.isFile().
map(File file)?把可读的文件Map到内存里,根据FileChannel.map将文件以只读方式完全映射到内存 FileChannel.map(java.nio.channels.FileChannel.MapMode, long, long).
map(File file, FileChannel.MapMode mode)?把文件使用规定的方式完全映射到内存中。使用 FileChannel.MapMode,根据FileChannel.map(java.nio.channels.FileChannel.MapMode, long, long)将文件完全映射到内存。
map(File file, FileChannel.MapMode mode, long size)?该方法和上面两个是一样的,只不过这个添加了一个size,意思是每次要Map到内存的大小,这个和上面的比较是这个可以正常使用.
newReader(File file, Charset charset)?该方法使用提供的编码方式把输入文件做成一个BufferedReader对象,并返回。
newWriter(File file, Charset charset)?该方法是和上边的类似功能。.
readBytes(File file, ByteProcessor<T>?processor)?已过时。使用 asByteSource(file).read(processor). 计划于2019年1月删除.
readFirstLine(File file, Charset charset)?已过时。使用 asCharSource(file, charset).readFirstLine(). 计划于2019年1月删除.
readLines(File file, Charset charset)?从文件中读取所有行。
readLines(File file, Charset charset, LineProcessor<T>?callback)?已过时。使用 asCharSource(file, charset).readLines(callback). 计划于2019年1月删除.
simplifyPath(String pathname)?该方法是将提供的目录路径简化,具体的就是空的字符串变成“.”,然后“.”依然保留,将“./”折叠起来,“../”不一定折叠起来,可能会,删除多余的“/”,而且会删除尾部的“/”。.
toByteArray(File file)?将一个文件直接转化成一个字节数组,并返回。
toString(File file, Charset charset)?已过时。使用 asCharSource(file, charset).read(). 计划于2019年1月删除.
touch(File file)?创建一个空的文件或者使用和unix相同命令的方式更新文件的最后更新时间戳.
write(byte[] from, File to)?将一个字节数组里的数据全部写入到文件to里边.
write(CharSequence from, File to, Charset charset)?已过时。使用 asCharSink(to, charset).write(from). 计划于2019年1月删除.

使用Demo

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.common.io.FileWriteMode;
import com.google.common.io.Files;
import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FilesTest {

    private String SOURCE_PATH = "D:\\Users\\ex_luosz5\\Desktop\\test.txt";

    /**
     * 文件拷贝
     */
    @Test
    public void copy() throws Exception {
        Files.copy(new File("from file path"), new File("to file path"));
    }

    /**
     * 文件移动
     */
    @Test
    public void move() throws Exception {
        Files.move(new File("from file path"), new File("to file path"));
    }

    /**
     * 文件逐行读取
     */
    @Test
    public void readLines() throws Exception {
        File file = new File(SOURCE_PATH);
        List<String> lines = Files.readLines(file, Charsets.UTF_8);

        String result = Joiner.on("\n").join(lines);
        System.out.println("读取内容:" + result);
    }

    /**
     * 文件整体读取
     */
    @Test
    public void asCharSource() throws Exception {
//        String result = Files.asCharSource(new File(SOURCE_PATH), Charsets.UTF_8).readFirstLine();    // 第一行
        String result = Files.asCharSource(new File(SOURCE_PATH), Charsets.UTF_8).read();
        System.out.println("读取内容:" + result);
    }

    /**
     * 文件 hash 值
     * <p>
     * 在文件对比时候,可以看两个文件等hashCode 是否相等,比如拷贝文件后是否有损
     */
    @Test
    public void asByteSource() throws Exception {
        HashCode hashCode = Files.asByteSource(new File(SOURCE_PATH)).hash(Hashing.sha256());
        HashCode hashCode2 = Files.asByteSource(new File(SOURCE_PATH)).hash(Hashing.sha256());
        System.out.println(hashCode.equals(hashCode2));
        System.out.println(hashCode);
    }

    /**
     * 文件书写
     */
    @Test
    public void write() throws Exception {
        Files.asCharSink(new File(SOURCE_PATH), Charsets.UTF_8).write("覆盖 内容");

        Files.asCharSink(new File(SOURCE_PATH), Charsets.UTF_8, FileWriteMode.APPEND).write("\n\n追加 内容");
    }

    /**
     * 创建空文件
     */
    @Test
    public void test7() throws Exception {
        Files.touch(new File("D:\\Users\\ex_luosz5\\Desktop\\testnull.txt"));
    }

    /**
     * 递归文件
     */
    @Test
    public void test8() throws Exception {
        String path = "/Users/lasse/Desktop";
        List<File> list = new ArrayList<>();

        this.recursiveList(new File(path), list);

        list.forEach(System.out::println);
    }

    private void recursiveList(File root, List<File> fileList) {
        if (root.isHidden()) return;
        if (root.isFile()) {
            fileList.add(root);
        } else {
            File[] files = root.listFiles();
            for (File f : files) {
                recursiveList(f, fileList);
            }
        }
    }

    /**
     * 递归文件
     *
     * breadthFirst 为【广度优先遍历】
     * depthFirstPreOrder 和 depthFirstPostOrder 为【深度优先遍历】
     *
     * 广度优先、深度优先 参考文章:https://www.jishux.com/p/7dbaf8611d052037
     * */
    @Test
    public void test9() throws Exception {
        String path = "D:\\Users\\ex_luosz5\\Desktop\\噪音";

        Iterable<File> files = Files.fileTraverser().breadthFirst(new File(path));
        files.forEach(System.out::println);

        System.out.println("-------------------截断-----------------------------");

        // 第一次访问到节点的顺序(Pre-order)
        Iterable<File> depthFirstPreOrderFiles = Files.fileTraverser().depthFirstPreOrder(new File(path));
        files.forEach(System.out::println);

        System.out.println("-------------------截断-----------------------------");

        // 访问到最后,然后回退访问节点的顺序(Post-order)
        Iterable<File> depthFirstPostOrderFiles = Files.fileTraverser().depthFirstPostOrder(new File(path));
        files.forEach(System.out::println);
    }


}

文章来源:https://blog.csdn.net/qq_63815371/article/details/135518709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。