Google Guava 快速入门 —— 【文件流】Files 文件工具类

Google Guava 快速入门.jpg

Guava Files 文件工具类

一、接口声明

以下是 com.google.common.io.Files 接口的声明:

@Beta
@GwtIncompatible
public final class Files
    extends Object

二、接口方法

官方文档:https://google.github.io/guava/releases/27.0.1-jre/api/docs/com/google/common/io/Files.html

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

三、测试类

package com.example.guava.io;

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.Files;
import org.junit.Test;

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

public class FilesTest {

    private String SOURCE_PATH = "/Users/liurenkui/desktop/grava_demo.txt";

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

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

    /**
     * 文件逐行读取
     */
    @Test
    public void test3() 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 test4() 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 tes54() throws Exception {
        HashCode hashCode = Files.asByteSource(new File(SOURCE_PATH)).hash(Hashing.sha256());
        System.out.println(hashCode);
    }

    /**
     * 文件书写
     */
    @Test
    public void test6() 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(""));
    }

    /**
     * 递归文件
     */
    @Test
    public void test8() throws Exception {
        String path = "/Users/liurenkui/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 = "/Users/liurenkui/Desktop";

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

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

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

四、相关文章



未经允许请勿转载:程序喵 » Google Guava 快速入门 —— 【文件流】Files 文件工具类

点  赞 (0) 打  赏
分享到: