让开发效率爆表的Guava ---- Files文件操作

  相信很多人最开始用JDK库对文件进行操作时, 都被繁琐重复的代码所恶心到, 当然这也是各种库出现的原因。 接下来介绍Guava的Files类, 提供了对文件操作的极大简化, 如程序员可以完全不用关心流的开关闭。


  本文大致介绍了文件的复制、重命名、内容读取等对文件的基本操作。  


代码示例:

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.common.io.*;

import java.io.*;
import java.nio.charset.Charset;
import java.util.List;

/**
 * Created by wenniuwuren on 2015/6/16.
 */
public class FilesTest {

    public static void main(String[] args) {

        try {
            FilesTest filesTest = new FilesTest();

            // 一个文件内容复制到另一个文件中
            /*File original = new File("E:\\test\\original");
            File copy = new File("E:\\test\\copy");
            if (original.isFile() && copy.isFile()) {
                Files.copy(original, copy);
            }*/

            // 文件重命名
           /* File originalFile = new File("E:\\test\\1.txt");
            File newFile = new File("E:\\test\\2.txt");
            if (originalFile.isFile() && newFile.isFile()) {
                Files.move(originalFile, newFile);
            }*/

            // 将文件内容一行一行读取出来
            File file = new File("E:\\test\\1.txt");
            List<String> expectedLines = Lists.newArrayList("The quick brown", " fox jumps over", " the lazy dog");
            List<String> readLines = Files.readLines(file, Charsets.UTF_8);
            System.out.printf(readLines.toString());

            // 为文件生成一个hashcode
            HashCode hashCode = Files.hash(file, Hashing.md5());
            System.out.println(hashCode);

            // 文件 写/新增内容     完全不用去关心打开打开流/关闭流
            String hamletQuoteStart = "To be, or not to be";
            Files.write(hamletQuoteStart, file, Charsets.UTF_8);
            String hamletQuoteEnd = "that is a question";
            Files.append(hamletQuoteEnd, file, Charsets.UTF_8);


            // Sources读  Sinks写
            // Sources 和 Sinks 不是 streams', readers', 或者 writers' 对象
            // 但是提供相同功能
            File dest = new File("E:\\test\\2.txt");
            //dest.deleteOnExit();
            File source = new File("E:\\test\\1.txt");
            ByteSource byteSource = Files.asByteSource(source);
            ByteSink byteSink = Files.asByteSink(dest);
            byteSource.copyTo(byteSink);
            System.out.println(byteSink + ", " + byteSource);


            // 把几个文件内容写到同一个文件下
            File f1 = new File("E:\\test\\1.txt");
            File f2 = new File("E:\\test\\2.txt");
            File f3 = new File("E:\\test\\3.txt");
            File joinedOutput = new File("E:\\test\\4.txt");
            //joinedOutput.deleteOnExit();
            // 为每个文件生成InputSupplier(使用Closer去管理关闭底层I/O资源)
            List<InputSupplier<InputStreamReader>> inputSuppliers = filesTest.getInputSuppliers(f1, f2, f3);
            // 逻辑上合并为一个InputSupplier
            InputSupplier<Reader> joinedSupplier = CharStreams.join(inputSuppliers);
            // 建立输出
            OutputSupplier<OutputStreamWriter> outputSupplier = Files.newWriterSupplier(joinedOutput, Charsets.UTF_8);
            // 将底层InputSuppliers写到OutputSupplier
            CharStreams.copy(joinedSupplier, outputSupplier);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String joinFiles(File... files) throws IOException {
        StringBuilder builder = new StringBuilder();
        for (File file : files) {
            builder.append(Files.toString(file, Charsets.UTF_8));
        }
        return builder.toString();
    }

    private List<InputSupplier<InputStreamReader>> getInputSuppliers(File... files) {
        List<InputSupplier<InputStreamReader>> list = Lists.newArrayList();
        for (File file : files) {
            list.add(Files.newReaderSupplier(file, Charsets.UTF_8));
        }
        return list;
    }
}


参考资料:

                《Getting Started with Google Guava》

你可能感兴趣的:(guava,字节流,字符流,文件,Files)