@@ -29,7 +29,7 @@ func cmdRead(args []string) error {
2929 flag .PrintDefaults ()
3030 }
3131 fs .BoolVar (& debug , "debug" , false , "enable printing debug messages" )
32- fs .IntVar (& bufferSize , "buffer-size" , 65536 , "buffer size" )
32+ fs .IntVar (& bufferSize , "buffer-size" , 2 * 1024 * 1024 , "buffer size" )
3333 fs .Int64Var (& offset , "offset" , 0 , "offset to read" )
3434 fs .Int64Var (& length , "length" , - 1 , "length to read" )
3535 if err := fs .Parse (args ); err != nil {
@@ -67,7 +67,20 @@ func cmdRead(args []string) error {
6767
6868 buf := make ([]byte , bufferSize )
6969 sr := io .NewSectionReader (img , offset , length )
70- _ , err = io .CopyBuffer (os .Stdout , sr , buf )
70+ w := & hideReadFrom {os .Stdout }
71+
72+ _ , err = io .CopyBuffer (w , sr , buf )
7173
7274 return err
7375}
76+
77+ // hideReadFrom hides os.File ReadFrom method to ensure that io.CopyBuffer()
78+ // will use our buffer, speeding up the copy significantly. For more info see
79+ // https://github.com/lima-vm/go-qcow2reader/pull/42.
80+ type hideReadFrom struct {
81+ f * os.File
82+ }
83+
84+ func (w * hideReadFrom ) Write (p []byte ) (int , error ) {
85+ return w .f .Write (p )
86+ }
0 commit comments