2014-09-03 53 views
1

Go具有非常好的io.Readerio.Writer接口,其大致對應於Java中的java.io.InputStreamjava.io.OutputStream類(即,io.Reader =字節流,io.Writer =用於字節的接收器)。在Go中有沒有java.io.Reader等價物?

我在想,如果Go還有一些等效的java.io.Reader(字符流)和java.io.Writer(接收字符)類。

我想要的是讀/寫字符串從/到流,而不考慮編碼所有的時間+支持不同的編碼不只是UTF8(這是什麼組合io.Reader +字符串類型轉換幾乎給我自由)。

更新:所以我想我的描述很混亂,我應該避免與Java的東西比較。我想要的是這樣的:

讀取器部分,讀取下一個128字節,並通過使用ISO-8859-2字符集解碼字節返回Go字符串。

 
stringReader := NewStringReader(reader, "iso-8859-2") 
stringReader.read(128) 

作家的一部分,轉換的東西UTF16-BE字節,並將其寫入作家:

 
stringWriter := NewStringWriter(writer, "utf16be") 
stringWriter.write("馞鮂 擙樲橚 褗褆諓"); 
+1

的java.io.InputStream是一個Java類,而io.Reader是Go接口,它們不相互對應。你可以在「io/ioutil」包中找到一些實用程序。 – rvignacio 2014-09-03 18:57:52

+0

你能舉一個你想要做什麼的例子嗎?與Java的比較沒有任何意義。 – JimB 2014-09-03 19:21:11

+0

@rvignacio:我用不同的行爲寫了我的java.io.InputStream子類的共享,以知道它們確實具有非常密切的對應關係。但這不是問題的關鍵。 – 2014-09-03 19:22:02

回答

3

我不與Java非常熟悉,但不會這樣做同樣的事情:

// w = io.Writer 
io.WriteString("stuff") 

// r = io.Reader 
sc := bufio.NewScanner(r) 
for scanner.Scan() { 
    fmt.Println(sc.Text()) 
} 

字符串是或多或少的readonly []字節。

//編輯

閱讀的評論後,我想你正在尋找https://code.google.com/p/go-charset

r, err := charset.NewReader("latin1", r) 
if err != nil { 
     log.Fatal(err) 
} 
result, err := ioutil.ReadAll(r) 
if err != nil { 
     log.Fatal(err) 
} 
fmt.Printf("%s\n", result) 
+1

感謝您理解我的困惑問題......這看起來很有希望! – 2014-09-03 19:34:35

+0

可能有點棘手:我不確定這個接口是否承諾多字節字符不會跨越一個塊;通過讀取一個完全由字符組成的塊來測試是非常容易的,該塊將三個UTF-8字節轉換爲2的冪次方塊。寫一個位於utf-8閱讀器之上的RuneReader可能是可能的,或者只是爲了確保沒有字符跨越塊而做的簿記,但這兩者都不是微不足道的(或自由的)。 – twotwotwo 2014-09-04 01:58:01

+0

(這裏也沒有,但是我[寫了些東西](http://play.golang.org/p/S99auj-ztY)查找以字符開始處開始的塊中最後一個utf8字符的結尾。這將是一個讀者的一小部分,但知道如何確保塊包含整個utf8字符。) – twotwotwo 2014-09-04 03:54:29

相關問題