2017-03-14 61 views
3

如何從Golang的標準輸入讀取大量數據?我所有的讀取當前停止在4095字節。我試過很多東西,但我現在的代碼如下所示:從標準輸入中讀取大量數據

var stdinReader = bufio.NewReader(os.stdin) 

// Input reads from stdin while echoing back. 
func Input(prompt string) []byte { 
    var data []byte 

    // Output prompt. 
    fmt.Print(prompt) 

    // Read until newline. 
    for { 
     bytes, isPrefix, _ := stdinReader.ReadLine() 
     data = append(data, bytes...) 

     if !isPrefix { 
      break 
     } 
    } 

    // Everything went well. Return the data. 
    return data 
} 

我使用掃描儀也嘗試過,但無法弄清楚如何退出

for scanner.Scan() { 
    data = append(data, scanner.Bytes()...) 
} 

換行符發生時(即當用戶按下返回時)。

我也嘗試了ReadBytes('\ n'),但即使是停止在4095字節。沒有增加緩衝區的大小(這只是一個醜陋的黑客攻擊),我不知道該怎麼做。

+0

在解決如何閱讀> 4095字節的問題之前,您試圖實現的目標是什麼?將「大量」數據浸入字節數組通常是一個壞主意。對於大多數用例,您應該在流上操作,以獲得更好的性能和更低的內存消耗。 – Flimzy

+0

@Flimzy這是一個很好的觀點,我會牢記在心。我後來計劃使用文件進行輸入,因此它將以塊(即流)的形式出現。我只是想知道是否有從stdin讀取超過4095字節的習慣方式。 – Awn

+0

爲什麼使用[ReadLine](https://golang.org/pkg/bufio/#Reader.ReadLine)?當'stdin'沒有'\ n'時,它會停下來,因爲你打斷了,當isPrefix。如何使用'Read()'? – apxp

回答

1

如果你看圍棋的來源,你會看到它使用默認的緩衝區大小:

func NewReader(rd io.Reader) *Reader { 
    return NewReaderSize(rd, defaultBufSize) 
} 

所以,你可以在你的代碼中使用如:

var stdinReader = bufio.NewReaderSize(os.Stdin, 10000) 

附: Go是開源的,所以你只需從內部查看內容就可以學到很多東西。

+0

是的,我知道緩衝區的大小可以改變,但這不是一個很好的解決方案。 – Awn

+1

這是非常好的解決方案。您每次都必須使用限制。你沒有無限的資源。只需將它設置爲適合您的尺寸。這是最佳做法。 –

+0

嗯謝謝你的解決方案,但它不是我要找的。我已經考慮過這個,它不適合我的用例。 – Awn