其实guava能够当作是支持java5的apache commons之类的项目.
第一第二回讲的主要是集合类的一些最经常使用的工具. 其实com.google.common.collect里还有不少很是有用的工具, 好比
Ordering,
ComparisonChain,
Iterables,
Multiset,
Multimap等等. 这里有些咱们后面还会涉及.
小兄弟正在作socket客户服务器通讯相关的课程设计, 因此我有点火烧眉毛先讲讲common.io这个包了. 这里面最有用的, 在我看来, 就是
CharStreams和
ByteStreams这两个工具.
你们知道, Java里读外设主要是跟InputStream和Reader打交道. 其中InputStream用来读取原始的字节流, 而Reader是在你已经知道了输入是用什么字符集编码的状况下读取字符串.
可是这两个类仍是相对底层了一些. 在作一些很灵活复杂的事情的时候是必要的, 甚至咱们还须要抬出nio这个大杀器. 可它们对平常工做中一些简单的事情, 就有炮弹打蚊子的感受.
好比, 我须要从一个Reader里一行一行读出全部文本. 直接用Reader的话, 你须要弄一个BufferedReader, 而后循环调用readLine(), 直到所有读完. 相似这样:
BufferedReader buffered = new BufferedReader(reader);
List<String> lines = new ArrayList<String>();
for (;;) {
String line = buffered.readLine();
if (line == null) {
break;
}
lines.add(line);
}
用CharStreams的话, 一句话就搞定了:
List<String> lines = CharStreams.readLines(reader);
若是你仍是须要相似于流同样的操做-好比, 输入的行数太多, 不能一会儿都读进来, 那么, 还有一个
LineReader能够用. 用起来相似于:
LineReader lineReader = new LineReader(reader);
for (String line = lineReader.readLine(); line != null; line = lineReader.readLine()) {
System.out.println(line);
}
其它的one-liner, 包括:
从一个Readable读取全部东西写到一个Appendable里去:
CharStreams.copy(reader, writer);
从Readable读取全部内容到一个字符串:
String content = CharStreams.toString(reader);
另外, 写io程序一个最多见的bug, 就是打开东西忘记关了. 或者关的不完全. 通常来讲, 你要开一个InputStream, 确定要接下来用一个try-finally, 在用完以后调用close()把它关上. OutputStream, Reader, Writer同理.
可是这很麻烦, 并且容易忘. 在java7的
自动资源管理出来以前, 能够用common.io包定义的InputSupplier, OutputSupplier接口.
原理是, 你实现一个InputSupplier对象, 把"怎样打开这个InputStream/Reader"的逻辑封装在getInput()它的函数里, 而后, 把它传递给CharStreams, ByteStreams相关的API, 好比readLines(), copy()等, 这些API调用你的supplier, 而后作事, 作完以后它把本身屁股擦干净, 把它打开的InputSteam/Reader再关上.
ByteStreams很相似, 不过它是工做在字节流上, 而不关心字符编码问题.
对应于CharStreams.toString(), 是
byte[] content = ByteStreams.toByteArray(inputStream)
用来把整个InputStream的内容所有一次性读到一个byte[]里面.
对应于CharStreams.copy(), 是
ByteStreams.copy(inputStream, outputStream);
用来把全部内容从一个InputStream拷贝到另外一个OutputStream. 嗯. 以上.