瓜娃系列 (4) - Resources和Files

另外一對我經常需要用到的, 是[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Resources.html]Resources[/url]和[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html]Files[/url].

一般來說, 如果我有一大塊的文本, 或者properties文件, xml, 我會選擇把它們存到一個文本文件裏, 放到jar裏. 然後在運行時, 把這個文件當作資源讀出. 這樣做比直接存到文件系統裏面的好處, 在於它對部署方式不敏感, 不管我的代碼如何部署, 我只需要從ClassLoader找到我要的文件就好了.

我可以直接用ClassLoader來尋找我的資源, 象這樣:
[code]
URL url = getClass().getClassLoader().getResource("mypackage/myfile.txt");
if (url == null) {
throw new IOException("mypackage/myfile.txt 沒找到!");
}
...
[/code]
把要找的資源名包括在錯誤信息中很重要. 很多時候, 或者是部署的問題, 或者是程序錯誤, getResource()會返回null. 如果你不包括這個資源名, 甚至不做這個null檢查就直接用這個url變量, 程序會拋出異常, 但是查找錯誤相當不方便, 無謂浪費時間.

我也可以用Resources來更方便地做同樣的事:
[code]
URL url = Resources.getResource("mypackage/myfile.txt");
[/code]
[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Resources.html#getResource(java.lang.String)]Resources.getResource()[/url]自動包括了錯誤檢查.

得到了這個URL, 我就可以從裏面讀出內容. 如果它是一個文本文件, 我可以用Resources.toString():
[code]
String content = Resources.toString(url);
[/code]

或者如果我需要按行讀出:
[code]
String[] lines = Resources.readLines(url, Charsets.UTF_8);
[/code]

這裏, 要給[url=http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html]com.google.common.base.Charsets[/url]做個廣告. 它提供了一些標準的所有平臺都支持的Charset常量, 非常非常有用!

而如果是一個二進制文件, 我可以用Resources.toByteArray():
[code]
byte[] content = Resources.toByteArray(url);
[/code]

相比之下, Files相對不是那麼常用. 但是有時候當你需要操作文件的時候, 它提供的工具函數還是很頂事的. 比如, 你可以同樣地從文本或二進制文件讀取字符串或者字節:
[code]
String content = Files.toString(textFile, Charsets.UTF_8);
byte[] byteArray = Files.toByteArray(binaryFile);
[/code]
可以向文件裏寫內容:
[code]
Files.write(content, textFile, Charsets.ASCII);
Files.write(byteArray, binaryFile);
[/code]
也可以拷貝文件:
[code]
Files.copy(fromFile, toFile);
[/code]
具體的大家看文檔吧, 應該很簡單地.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章