Zlib::GzipReader
funktioniert wie die meisten IO
-ähnlichen Klassen in Ruby. Sie haben einen Aufruf von open
, und wenn Sie einen Block an ihn übergeben, erhält der Block das IO
-like-Objekt. Stellen Sie sich vor, Sie können während der Blockdauer mit einer Datei oder Ressource etwas bequem machen.
Aber das bedeutet, dass gz
in Ihrem Beispiel ein IO
-ähnliches Objekt ist und nicht wie erwartet der Inhalt der gzip-Datei. Du musst noch read
davon haben, um das zu erreichen. Die einfachste Lösung wäre dann:
Beachten Sie, dass dadurch der gesamte Inhalt des unkomprimierten gzip in den Speicher gelesen wird.
Wenn Sie wirklich nur von einer Datei in eine andere kopieren, können Sie die effizientere Methode IO.copy_stream
verwenden. Ihr Beispiel könnte dann so aussehen:
Hinter den Kulissen wird versucht, den in bestimmten Situationen unter Linux verfügbaren sendfile
syscall zu verwenden. Andernfalls wird das Kopieren in schnellen C-Code-Blöcken von 16 KB gleichzeitig ausgeführt. Dies habe ich aus dem Quelltext von Ruby 1.9.1 gelernt.