相信很多人最开始用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》
原文地址:http://blog.csdn.net/wenniuwuren/article/details/46526479