2017-07-27 131 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

如果你想捕捉的字節都寫,使用io.MultiWriterbytes.Buffer作爲第二個作家。

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

或看到標準輸出的文件,因爲它是寫:

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

否則,如果你想重新讀取相同的文件,你需要寫後尋求回到開始:

codeFile.Seek(0, 0) 
+1

或者因爲在這個例子中他希望在控制檯上輸出,所以他可以通過'os.Stdout'作爲第二個編寫器:'w:= io.MultiWriter(codeFile,os.Stdout)'。 – icza

+0

「io.Multiwriter」文檔示例提供了有關使用情況的明確信息。首先使用'io.MultiWriter'設置所有編寫器,然後調用'io.Copy'。所以人們可以去'io.MultiWriter(codeFile,&buf,os.Stdout)' – Ravi