文章目錄
I/O:針對Java 5和6版本的簡化的I/O操作,尤其是在整個I/O流和文件上。
1.ByteStreams
和CharStreams
Guava使用術語“流”來表示在底層資源中具有位置狀態I/O數據的Closeable
流。術語"字節
流"是指InputStream
或OutputStream
,而"字符
流"是指Reader
或Writer
(儘管它們的超類型Readable
和Appendable
通常用作方法參數類型)。相應的工具分爲工具類ByteStreams
和CharStreams
。
大多數與Guava流相關的工具一次處理整個流[和/或]處理自身的緩衝以提高效率。還要注意,獲取流的Guava方法不會關閉流:關閉流通常是打開流的代碼的責任。
這些類提供的一些方法包括:
2.Sources and sinks
創建I/O工具方法很常見,該方法可以幫助你在進行基本操作時完全避免處理流。例如,Guava有Files.toByteArray(File)
和Files.write(File, byte[])
。但是,最終你將得到類似的方法,這些方法遍佈各處,每種方法都處理不同類型的數據源或可寫入數據的接收器。例如,Guava有Resources.toByteArray(URL)
,它與Files.toByteArray(File)
作用相同,但是使用URL
作爲數據源而不是文件。
爲了解決這個問題,Guava對不同類型的數據源和接收器提供了一組抽象。源或接收器是你知道如何打開新流的某種資源,例如File
或URL
。源是可讀的,而接收器是可寫的。此外,根據你要處理的是字節
數據還是字符
數據,還細分了源和接收器。
操作 | 字節 | 字符 |
---|---|---|
Reading | ByteSource |
CharSource |
Writing | ByteSink |
CharSink |
這些API的優點是它們提供了一組通用的操作。例如,一旦將數據源包裝爲ByteSource
後,無論該源是什麼,都將獲得相同的方法集。
2.1創建sources and sinks
Guava提供了許多源和接收器實現:
此外,你可以自己擴展源和接收器類以創建新的實現。
注意:雖然可能很想創建一個包裝打開流(例如InputStream
)的源或接收器,但應避免這種情況。你的源/接收器應該在每次調用其openStream()
方法時打開一個新流。這允許源或接收器控制該流的整個生命週期,並使其可以多次使用,而不是第一次調用該流上的任何方法而變得不可用。此外,如果你在創建源或接收器之前打開流,那麼如果在代碼的其他地方拋出異常,則可能還必須確保正確關閉流,這會破壞首先使用源或接收器的許多優點。
2.2使用Sources and Sinks
一旦有了源或接收器實例,就可以訪問許多用於讀取或寫入的操作。
2.2.1通用操作
所有源和接收器都提供了打開新流以進行讀取或寫入的功能。默認情況下,其他操作都可以通過這些方法之一獲取流、執行某些操作,然後確保關閉流來實現的。
這些方法都被命名爲:
openStream()
——根據源或接收器的類型返回InputStream
、OutputStream
、Reader
或Writer
。openBufferedStream()
——根據源或接收器的類型返回InputStream
、OutputStream
、BufferedReader
或Writer
。如果有必要,保證返回的流被緩衝。例如,從字節數組讀取的源不需要在內存中進行額外緩衝。這就是爲什麼這些方法不返回BufferedInputStream
等的原因,除了在BufferedReader
的情況下,因爲它定義了readLine()
方法。
2.2.2Source操作
2.2.3Sink操作
2.3示例
// Read the lines of a UTF-8 text file
ImmutableList<String> lines = Files.asCharSource(file, Charsets.UTF_8)
.readLines();
// Count distinct word occurrences in a file
Multiset<String> wordOccurrences = HashMultiset.create(
Splitter.on(CharMatcher.whitespace())
.trimResults()
.omitEmptyStrings()
.split(Files.asCharSource(file, Charsets.UTF_8).read()));
// SHA-1 a file
HashCode hash = Files.asByteSource(file).hash(Hashing.sha1());
// Copy the data from a URL to a file
Resources.asByteSource(url).copyTo(Files.asByteSink(file));
3.Files
除了用於創建文件源和接收器的方法之外,Files
類還包含許多你可能感興趣的便捷方法。
方法 | 描述 |
---|---|
createParentDirs(File) |
創建文件的必要但不存在的父目錄。 |
getFileExtension(String) |
獲取路徑描述的文件的文件擴展名。 |
getNameWithoutExtension(String) |
獲取已刪除擴展名的文件的名稱 |
simplifyPath(String) |
清理路徑。並不總是與你的文件系統一致;仔細測試! |
fileTraverser() |
返回一個可以遍歷文件樹的Traverser |
本文參考:
IOExplained
guava-tests-io