2012-12-01 100 views
17

我知道從bufio包中golang的具體函數。從golang中緩衝讀取器讀取特定字節數

func (b *Reader) Peek(n int) ([]byte, error) 

皮克返回下一個n個字節而不前進讀者。字節 在下次讀取呼叫時停止有效。如果Peek返回的字節數小於字節,它也會返回一個錯誤,解釋爲什麼讀取很短。如果n大於b的緩衝區大小,則 錯誤爲ErrBufferFull。

我需要能夠從讀取器讀取特定數量的字節,將提前讀取器。基本上,與上述功能相同,但是它提高了讀者。有人知道如何做到這一點?

回答

3

向讀取器傳遞一個n字節大小的緩衝區。

47

注意,bufio.Read方法調用的底層io.Read最多一次,這意味着它可以返回n < len(p),沒有達到EOF。如果你想讀的正是len(p)字節或失敗,出現錯誤,你可以使用io.ReadFull這樣的:

n, err := io.ReadFull(reader, p) 

這個工程即使讀者緩衝。

3

我prefering閱讀()特別是如果你要讀任何類型的文件,它可能是在大塊發送數據也非常有用,下面是一個例子來說明如何使用它

fs, err := os.Open("fileName"); 

if err != nil{ 
    fmt.Println("error reading file") 
    return 
} 

defer fs.Close() 

reader := bufio.NewReader(fs) 

buf := make([]byte, 1024) 

for{ 
    v, _ := reader.Read(buf) //ReadString and ReadLine() also applicable or alternative 

    if v == 0{ 
     return 
    } 
    //in case it is a string file, you could check its content here... 
    fmt.Print(string(buf)) 
} 
0

要做到這一點,你只需要創建一個字節片和read數據到這片與

n := 512 
buff := make([]byte, n) 
fs.Read(buff) // fs is your reader. Can be like this fs, _ := os.Open('file') 

func (b *Reader) Read(p []byte) (n int, err error)

將數據讀入p。它返回讀入p的字節數。 的字節被從至多一個讀取在下層閱讀器, 因此n可以是小於LEN(P)