Google Guava與IO操作相關的類

I/O:針對Java 5和6版本的簡化的I/O操作,尤其是在整個I/O流和文件上。

1.ByteStreamsCharStreams

Guava使用術語“流”來表示在底層資源中具有位置狀態I/O數據的Closeable流。術語"字節流"是指InputStreamOutputStream,而"字符流"是指ReaderWriter(儘管它們的超類型ReadableAppendable通常用作方法參數類型)。相應的工具分爲工具類ByteStreamsCharStreams

大多數與Guava流相關的工具一次處理整個流[和/或]處理自身的緩衝以提高效率。還要注意,獲取流的Guava方法不會關閉流:關閉流通常是打開流的代碼的責任。

這些類提供的一些方法包括:

ByteStreams CharStreams
byte[] toByteArray(InputStream) String toString(Readable)
N/A List<String> readLines(Readable)
long copy(InputStream, OutputStream) long copy(Readable, Appendable)
void readFully(InputStream, byte[]) N/A
void skipFully(InputStream, long) void skipFully(Reader, long)
OutputStream nullOutputStream() Writer nullWriter()

2.Sources and sinks

創建I/O工具方法很常見,該方法可以幫助你在進行基本操作時完全避免處理流。例如,Guava有Files.toByteArray(File)Files.write(File, byte[])。但是,最終你將得到類似的方法,這些方法遍佈各處,每種方法都處理不同類型的數據源或可寫入數據的接收器。例如,Guava有Resources.toByteArray(URL),它與Files.toByteArray(File)作用相同,但是使用URL作爲數據源而不是文件。

爲了解決這個問題,Guava對不同類型的數據源和接收器提供了一組抽象。源或接收器是你知道如何打開新流的某種資源,例如FileURL。源是可讀的,而接收器是可寫的。此外,根據你要處理的是字節數據還是字符數據,還細分了源和接收器。

操作 字節 字符
Reading ByteSource CharSource
Writing ByteSink CharSink

這些API的優點是它們提供了一組通用的操作。例如,一旦將數據源包裝爲ByteSource後,無論該源是什麼,都將獲得相同的方法集。

2.1創建sources and sinks

Guava提供了許多源和接收器實現:

字節 字符
Files.asByteSource(File) Files.asCharSource(File, Charset)
Files.asByteSink(File, FileWriteMode...) Files.asCharSink(File, Charset, FileWriteMode...)
MoreFiles.asByteSource(Path, OpenOption...) MoreFiles.asCharSource(Path, Charset, OpenOption...)
MoreFiles.asByteSink(Path, OpenOption...) MoreFiles.asCharSink(Path, Charset, OpenOption...)
Resources.asByteSource(URL) Resources.asCharSource(URL, Charset)
ByteSource.wrap(byte[]) CharSource.wrap(CharSequence)
ByteSource.concat(ByteSource...) CharSource.concat(CharSource...)
ByteSource.slice(long, long) N/A
CharSource.asByteSource(Charset) ByteSource.asCharSource(Charset)
N/A ByteSink.asCharSink(Charset)

此外,你可以自己擴展源和接收器類以創建新的實現。

注意:雖然可能很想創建一個包裝打開流(例如InputStream)的源或接收器,但應避免這種情況。你的源/接收器應該在每次調用其openStream()方法時打開一個新流。這允許源或接收器控制該流的整個生命週期,並使其可以多次使用,而不是第一次調用該流上的任何方法而變得不可用。此外,如果你在創建源或接收器之前打開流,那麼如果在代碼的其他地方拋出異常,則可能還必須確保正確關閉流,這會破壞首先使用源或接收器的許多優點。

2.2使用Sources and Sinks

一旦有了源或接收器實例,就可以訪問許多用於讀取或寫入的操作。

2.2.1通用操作

所有源和接收器都提供了打開新流以進行讀取或寫入的功能。默認情況下,其他操作都可以通過這些方法之一獲取流、執行某些操作,然後確保關閉流來實現的。

這些方法都被命名爲:

  • openStream()——根據源或接收器的類型返回InputStreamOutputStreamReaderWriter
  • openBufferedStream()——根據源或接收器的類型返回InputStreamOutputStreamBufferedReaderWriter。如果有必要,保證返回的流被緩衝。例如,從字節數組讀取的源不需要在內存中進行額外緩衝。這就是爲什麼這些方法不返回BufferedInputStream等的原因,除了在BufferedReader的情況下,因爲它定義了readLine()方法。

2.2.2Source操作

ByteSource CharSource
byte[] read() String read()
N/A ImmutableList<String> readLines()
N/A String readFirstLine()
long copyTo(ByteSink) long copyTo(CharSink)
long copyTo(OutputStream) long copyTo(Appendable)
Optional<Long> sizeIfKnown() Optional<Long> lengthIfKnown()
long size() long length()
boolean isEmpty() boolean isEmpty()
boolean contentEquals(ByteSource) N/A
HashCode hash(HashFunction) N/A

2.2.3Sink操作

ByteSink CharSink
void write(byte[]) void write(CharSequence)
long writeFrom(InputStream) long writeFrom(Readable)
N/A void writeLines(Iterable<? extends CharSequence>)
N/A void writeLines(Iterable<? extends CharSequence>, String)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章