BufferedReader buffered = new BufferedReader(reader);List用CharStreams的话, 一句话就搞定了:lines = new ArrayList ();for (;;) { String line = buffered.readLine(); if (line == null) { break; } lines.add(line);}
List如果你还是需要类似于流一样的操作-比如, 输入的行数太多, 不能一下子都读进来, 那么, 还有一个 可以用. 用起来类似于:lines = CharStreams.readLines(reader);
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. 嗯. 以上.