@@ -29,7 +29,7 @@ func cmdRead(args []string) error {
29
29
flag .PrintDefaults ()
30
30
}
31
31
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" )
33
33
fs .Int64Var (& offset , "offset" , 0 , "offset to read" )
34
34
fs .Int64Var (& length , "length" , - 1 , "length to read" )
35
35
if err := fs .Parse (args ); err != nil {
@@ -67,7 +67,20 @@ func cmdRead(args []string) error {
67
67
68
68
buf := make ([]byte , bufferSize )
69
69
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 )
71
73
72
74
return err
73
75
}
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