2017-07-27 11 views
2

ファイルをエクスポートするライブラリがありますが、ファイルの内容をキャプチャしたいと思います。私は図書館にライターを渡し、ライターがファイルに書いたものを読むことができるようにしたいと思います。最終的に私はこのファイルの書き込みをスキップするライブラリを増やしたいと思います。 これはio.Copyまたはio.Pipeで可能ですか?io.Writerからの内容の読み取り

ライブラリコードは*ファイルを作成し、このハンドルをio.Writerとして使用します。 io.Copyを使用しようとしましたが、0バイトしか読み込まれませんでした。

func TestFileCopy(t *testing.T) { 

codeFile, err := os.Create("test.txt") 
if err != nil { 
    t.Error(err) 
} 
defer codeFile.Close() 
codeFile.WriteString("Hello World") 
n, err := io.Copy(os.Stdout, codeFile) 
if err != nil { 
    t.Error(err) 
} 
log.Println(n, "bytes") 
} 

答えて

4

あなたは彼らが書かれているように、第2のライターとしてbytes.Bufferio.MultiWriterを使用し、バイトをキャプチャしたい場合。

var buf bytes.Buffer 
w := io.MultiWriter(codeFile, &buf) 

またはそれが書かれているとして標準出力にファイルを参照するには:

w := io.MultiWriter(codeFile, os.Stdout) 

そうでないあなたは、あなたが書き込み後戻ってスタートを模索する必要があるが、同じファイルを再読み込みしたい場合は、:

codeFile.Seek(0, 0) 
+1

この例ではコンソールに出力したいので、2番目のライターとして 'os.Stdout'を渡すことができます:' w:= io.MultiWriter(codeFile、os.Stdout) '。 – icza

+0

'io.Multiwriter'のドキュメンテーションの例は、使い方を明確にしています。最初に 'io.MultiWriter'を使ってすべてのライターを設定し、' io.Copy'を呼び出します。ですから、 'io.MultiWriter(codeFile、&buf、os.Stdout)' – Ravi

関連する問題