2017-03-02 9 views
0

ファイル[]バイトをクラウドにアップロードし、クラウドからファイル[]バイトをダウンロードするプログラムの読み込みと書き込みメソッドを実装しようとしています。すでにバイトスライスを持っている場合のGolang Readerインタフェースの実装

これまでの私の読み取り方法は、同じ32KiBだけを読み取る無限の読み取りループに固執しています。

io.Copyを満たす入力として開いたファイルを使用しています。

は、私は私の実装が厄介であると確信して何とか

func (s S3File) Read(buffer []byte) (int, error){ 
if s.mode != "rb"{ 
    fmt.Println("Wrong mode used") 
} 
buf, err := s.DownBufferInfo(s.path) 
if err != nil{ 
    fmt.Println("Error from getting buffer for reader. at `rb` ") 
} 
allbytes := buf.Bytes() //BYTES READ FROM A FILE IN THE CLOUD 
fmt.Printf("len of bytes from reader --%v", len(allbytes)) 
///////////////////////////////////////////////////////// 
//result := copy(buffer, allbytes) 
//n := append(buffer, allbytes...) 
//////////////////////////////////////////////////////// 
fileBytes := bytes.NewBuffer(allbytes) 
result, err := fileBytes.Read(buffer) 
//////////////////////////////////////////////////////// 
//fileBytes := bytes.NewReader(allbytes) 
//result, err := fileBytes.Read(buffer) 
fmt.Printf("len of bytes read to buffer --%v", result) 
fmt.Printf("Total buffer len after read --%v", len(buffer)) 

return result, err 

}

編集:私はそれが仕事を得ることができたと答えは以下の従ってください。

+2

あなたのプログラムの残りの部分はわかりませんが、おそらく最初の32Kを何度も読んでファイルをダウンロードしているようです。私はあなたが何をしようとしているのかよく分かりませんが、バッファされたファイルのバイトがすでにある場合、なぜReadメソッドが必要ですか? – JimB

+0

Zipアーカイブを作成するには、io.Copyを使用する必要があります。このメソッドは、ReaderとWriterを使用します。 Zip.NewWriterはライターを雇う。 Golangのやり方とすべてがうまくいけば、いいだろう。とにかく、私は仕事に近づいています。 – Godfrey

+0

'[] byte'から' io.Reader'が必要な場合は 'bytes.Reader'のためのもので、' io.Writer'で '[byte] 'を取得する必要がある場合は、 'bytes.Buffer'です。ファイルはある時点で 'io.Reader'から来ているに違いないので、おそらくそれを直接使うことができます。あなたがここにいるのは、より多くのレイヤーを追加することです。単純なソリューションでなければならないものからさらに遠ざかります。 – JimB

答えて

0

私の主な動機はio.Copyを自分のコードに便利に使うことができたのですが、後でそれは私の現在のリーダーではまだ関係なく働いていなかったことが分かりました。

機能func Copy(dst Writer, src Reader) (written int64, err error)は、読み取り元と宛先のWriterを取ります。

私の一般的な読者は既に[]byteのスライスを私に提供しました。私が必要としていたのは、これらのバイトを取り込むライターでした。

次のように都合のに十分な、dst Writerはライターインターフェイスを実装しています:

type Writer interface { 
    Write(p []byte) (n int, err error) 

}

私はすべてがちょうど行いました。

dst.Write(my_slice_byte) 

またI再書いた私の読むの実装が、それ必要ありませんでした。

関連する問題