其實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. 嗯. 以上.