2012-12-01 14 views
17

bufioパッケージからgolangの特定の機能を認識しています。ゴランのバッファードリーダーから特定のバイト数を読み取る

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

PEEKは読者を進めることなく、次のnバイトを返します。バイト は、次の読み取り呼び出し時に有効ではなくなります。 Peekがn バイトよりも少ないバイト数を返すと、読み込みが短い理由を説明するエラーも返されます。 nがbのバッファサイズより大きい場合、 エラーはErrBufferFullです。

私はは、読者を進めることをリーダーから特定のバイト数を読み取ることができるようにする必要があります。基本的には、上記の関数と同じですが、読者を進歩させます。誰かがこれを達成する方法を知っていますか?

答えて

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

http://golang.org/pkg/bufio/#Reader.Read

バイトの読み取りの数はbufio.Read方法は、それがEOFに到達することなく、n < len(p)を返すことができることを意味し、高々一度基礎となるio.Readを呼び出すことlen(p)

+7

、それだけに制限します従って根本的リーダー、 に最大1つの読み取りから採取されたn個(P)LEN未満であってもよいですlen(p)に読み込まれたバイト。 – dustinevan

3

リーダーにnバイトサイズのバッファを渡します。

47

ノートに制限されます。あなたは正確に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

これを行うには、あなただけの

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)

と、このスライスにバイトのスライスと readデータを作成する必要があります

読み取り読み取りデータをp。 pに読み込まれたバイト数を返します。 バイトはこれはいつも 'しかし特定のバイト数を読まないであろう

関連する問題