日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Google Guava] 9-I/O

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Google Guava] 9-I/O 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接?譯文鏈接?譯者:沈義揚

字節流和字符流

Guava使用術語”流” 來表示可關閉的,并且在底層資源中有位置狀態的I/O數據流。術語”字節流”指的是InputStream或OutputStream,”字符流”指的是Reader 或Writer(雖然他們的接口Readable 和Appendable被更多地用于方法參數)。相應的工具方法分別在ByteStreams?和CharStreams中。

大多數Guava流工具一次處理一個完整的流,并且/或者為了效率自己處理緩沖。還要注意到,接受流為參數的Guava方法不會關閉這個流:關閉流的職責通常屬于打開流的代碼塊。

其中的一些工具方法列舉如下:

ByteStreamsCharStreams
byte[] toByteArray(InputStream)String toString(Readable)
N/AList<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()

關于InputSupplier 和OutputSupplier要注意:

在ByteStreams、CharStreams以及com.google.common.io包中的一些其他類中,某些方法仍然在使用InputSupplier和OutputSupplier接口。這兩個借口和相關的方法是不推薦使用的:它們已經被下面描述的source和sink類型取代了,并且最終會被移除。

源與匯

通常我們都會創建I/O工具方法,這樣可以避免在做基礎運算時總是直接和流打交道。例如,Guava有Files.toByteArray(File) 和Files.write(File, byte[])。然而,流工具方法的創建經常最終導致散落各處的相似方法,每個方法讀取不同類型的源

或寫入不同類型的匯[sink]。例如,Guava中的Resources.toByteArray(URL)和Files.toByteArray(File)做了同樣的事情,只不過數據源一個是URL,一個是文件。

為了解決這個問題,Guava有一系列關于源與匯的抽象。源或匯指某個你知道如何從中打開流的資源,比如File或URL。源是可讀的,匯是可寫的。此外,源與匯按照字節和字符劃分類型。

?字節字符
ByteSourceCharSource
ByteSinkCharSink

源與匯API的好處是它們提供了通用的一組操作。比如,一旦你把數據源包裝成了ByteSource,無論它原先的類型是什么,你都得到了一組按字節操作的方法。

創建源與匯

Guava提供了若干源與匯的實現:

字節字符
Files.asByteSource(File)Files.asCharSource(File, Charset)
Files.asByteSink(File, FileWriteMode...)Files.asCharSink(File, Charset, FileWriteMode...)
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
N/AByteSource.asCharSource(Charset)
N/AByteSink.asCharSink(Charset)

此外,你也可以繼承這些類,以創建新的實現。

注:把已經打開的流(比如InputStream)包裝為源或匯聽起來是很有誘惑力的,但是應該避免這樣做。源與匯的實現應該在每次openStream()方法被調用時都創建一個新的流。始終創建新的流可以讓源或匯管理流的整個生命周期,并且讓多次調用openStream()返回的流都是可用的。此外,如果你在創建源或匯之前創建了流,你不得不在異常的時候自己保證關閉流,這壓根就違背了發揮源與匯API優點的初衷。

使用源與匯

一旦有了源與匯的實例,就可以進行若干讀寫操作。

通用操作

所有源與匯都有一些方法用于打開新的流用于讀或寫。默認情況下,其他源與匯操作都是先用這些方法打開流,然后做一些讀或寫,最后保證流被正確地關閉了。這些方法列舉如下:

  • openStream():根據源與匯的類型,返回InputStream、OutputStream、Reader或者Writer。
  • openBufferedStream():根據源與匯的類型,返回InputStream、OutputStream、BufferedReader或者BufferedWriter。返回的流保證在必要情況下做了緩沖。例如,從字節數組讀數據的源就沒有必要再在內存中作緩沖,這就是為什么該方法針對字節源不返回BufferedInputStream。字符源屬于例外情況,它一定返回BufferedReader,因為BufferedReader中才有readLine()方法。

源操作

字節源字符源
byte[] ? read()String ? read()
N/AImmutableList<String> ? readLines()
N/AString ? readFirstLine()
long ? copyTo(ByteSink)long ? copyTo(CharSink)
long ? copyTo(OutputStream)long ? copyTo(Appendable)??
long ? size()?(in bytes)N/A
boolean ? isEmpty()boolean ? isEmpty()
boolean ? contentEquals(ByteSource)N/A
HashCode ? hash(HashFunction)N/A

匯操作

字節匯字符匯
void write(byte[])void write(CharSequence)
long writeFrom(InputStream)long writeFrom(Readable)
N/Avoid writeLines(Iterable<? extends CharSequence>)
N/Avoid writeLines(Iterable<? extends CharSequence>, String)

范例

01//Read the lines of a UTF-8 text file
02ImmutableList<String> lines = Files.asCharSource(file, Charsets.UTF_8).readLines();
03//Count distinct word occurrences in a file
04Multiset<String> wordOccurrences = HashMultiset.create(
05????????Splitter.on(CharMatcher.WHITESPACE)
06????????????.trimResults()
07????????????.omitEmptyStrings()
08????????????.split(Files.asCharSource(file, Charsets.UTF_8).read()));
09?
10//SHA-1 a file
11HashCode hash = Files.asByteSource(file).hash(Hashing.sha1());
12?
13//Copy the data from a URL to a file
14Resources.asByteSource(url).copyTo(Files.asByteSink(file));

文件操作

除了創建文件源和文件的方法,Files類還包含了若干你可能感興趣的便利方法。

createParentDirs(File)必要時為文件創建父目錄
getFileExtension(String)返回給定路徑所表示文件的擴展名
getNameWithoutExtension(String)返回去除了擴展名的文件名
simplifyPath(String)規范文件路徑,并不總是與文件系統一致,請仔細測試
fileTreeTraverser()返回TreeTraverser用于遍歷文件樹

原創文章,轉載請注明:?轉載自并發編程網 – ifeve.com本文鏈接地址:?[Google Guava] 9-I/O

from:?http://ifeve.com/google-guava-io/?

總結

以上是生活随笔為你收集整理的[Google Guava] 9-I/O的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。