2016-05-31 38 views
2

我有一個程序,結合了多個http響應,並寫入文件上的各個查找位置。我目前通過在Go中,如何有效地將流式http響應主體寫入文件中的查找位置?

client := new(http.Client) 
req, _ := http.NewRequest("GET", os.Args[1], nil) 
resp, _ := client.Do(req) 
defer resp.Close() 
reader, _ := ioutil.ReadAll(resp.Body) //Reads the entire response to memory 
//Some func that gets the seek value someval 
fs.Seek(int64(someval), 0) 
fs.Write(reader) 

這有時會導致因爲ioutil.ReadAll的大內存使用情況做這個。

我試圖bytes.Buffer作爲

buf := new(bytes.Buffer) 
offset, _ := buf.ReadFrom(resp.Body) //Still reads the entire response to memory. 
fs.Write(buf.Bytes()) 

,但它仍然是相同的。

我的意圖是使用緩衝寫入文件,然後再次尋找偏移量,並繼續寫入直到流的結束被接收(並因此從buf.ReadFrom中捕獲偏移值)。但它也將所有內容都保存在記憶中並立即寫入。

直接向磁盤寫入類似流的最佳方式是什麼,而不將整個內容保存在緩衝區中?

一個理解的例子將不勝感激。

謝謝。

+0

如果你能讀響應體之前得到'someval':剛看了'someval'字節數從身體,而忽略他們,然後讀其餘的,或直接複製到文件。 – Volker

+0

謝謝@Volker,我試圖在第二種情況下使用bytes.Buffer讀取'someval'多個字節,這顯然沒有發生,因爲我不知道如何正確執行它。如果你的意思是使用http'range'頭來讀取幾個字節,然後一次又一次地執行,那麼我正在訪問的http端點有一個連接限制,這限制了我在我的結尾處產生了太多的連接,依次將是耗時的。 – scott

回答

3

使用io.Copy的響應體複製到文件:

resp, _ := client.Do(req) 
defer resp.Close() 
//Some func that gets the seek value someval 
fs.Seek(int64(someval), 0) 
n, err := io.Copy(fs, resp.Body) 
// n is number of bytes copied 
相關問題