另一對我常常須要用到的, 是
Resources和
Files.
通常來講, 若是我有一大塊的文本, 或者properties文件, xml, 我會選擇把它們存到一個文本文件裏, 放到jar裏. 而後在運行時, 把這個文件看成資源讀出. 這樣作比直接存到文件系統裏面的好處, 在於它對部署方式不敏感, 無論個人代碼如何部署, 我只須要從ClassLoader找到我要的文件就行了.
我能夠直接用ClassLoader來尋找個人資源, 象這樣:
URL url = getClass().getClassLoader().getResource("mypackage/myfile.txt");
if (url == null) {
throw new IOException("mypackage/myfile.txt 沒找到!");
}
...
把要找的資源名包括在錯誤信息中很重要. 不少時候, 或者是部署的問題, 或者是程序錯誤, getResource()會返回null. 若是你不包括這個資源名, 甚至不作這個null檢查就直接用這個url變量, 程序會拋出異常, 可是查找錯誤至關不方便, 無謂浪費時間.
我也能夠用Resources來更方便地作一樣的事:
URL url = Resources.getResource("mypackage/myfile.txt");
Resources.getResource()自動包括了錯誤檢查.
獲得了這個URL, 我就能夠從裏面讀出內容. 若是它是一個文本文件, 我能夠用Resources.toString():
String content = Resources.toString(url);
或者若是我須要按行讀出:
String[] lines = Resources.readLines(url, Charsets.UTF_8);
這裏, 要給
com.google.common.base.Charsets作個廣告. 它提供了一些標準的全部平臺都支持的Charset常量, 很是很是有用!
而若是是一個二進制文件, 我能夠用Resources.toByteArray():
byte[] content = Resources.toByteArray(url);
相比之下, Files相對不是那麼經常使用. 可是有時候當你須要操做文件的時候, 它提供的工具函數仍是很頂事的. 好比, 你能夠一樣地從文本或二進制文件讀取字符串或者字節:
String content = Files.toString(textFile, Charsets.UTF_8);
byte[] byteArray = Files.toByteArray(binaryFile);
能夠向文件裏寫內容:
Files.write(content, textFile, Charsets.ASCII);
Files.write(byteArray, binaryFile);
也能夠拷貝文件:
Files.copy(fromFile, toFile);
具體的你們看文檔吧, 應該很簡單地.