2010-02-02 19 views
6

Bir kullanıcı web siteme büyük bir dosya yükler ve ben dosyayı gzip bir blob halinde saklamak istiyorum. Yani sıkıştırılmamış bir InputStream var ve blob bir InputStream istiyor. Bir InputStream'in GZIPOutputStream kullanarak bir Outputstream'e nasıl sıkıştırılacağını biliyorum, fakat gzip'ed OutputStream'den bloğun ihtiyaç duyduğu InputStream'e nasıl geri dönüyorum.Sıkıştırılmamış bir InputStream'i gzip'ed InputStream'e verimli bir şekilde nasıl dönüştürebilirim?

Bulamamın tek yolu, ByteArrayOutputStream kullanımını ve daha sonra toByteArray kullanarak yeni bir InputStream oluşturmayı içerir. Fakat bu, dosyanın belleğin tamamında bir kopyasına sahip olduğum anlamına gelir. Ve eğer JDBC sürücüsü uygulaması akışı bir bayt [] da dönüştürdüyse, bu yüzden de bana sürpriz olmazdı.

+0

Dosyanın tamamını bellekte istemiyorsanız, bir dosyaya yazın. Gördüğüm şekilde gzip'd veri bir yere gitmeli. –

+0

Doğrudan bloğa akmayı umuyordum, böylece tüm şeyi hafızada tutmak zorunda kalmam. Blob parametresini ayarladığım zamandaki uzunluğu bilmem gerektiğinden işe yaramayacak gibi görünüyor. Teknik olarak, bir dosyaya akabilirim, dosyanın büyüklüğünü elde edebilirim, daha sonra blob içine bir girdi akışı olarak kullanabilirim, böylece tüm şeyi bellekte tutmam gerekmeyecek. Aslında dosya sistemini bu durumda belleğim olarak kullanacağım, ki bu da yararlı olabilir. –

cevap

4

java 1.6 kullanıyorsanız java.util.zip.DeflaterInputStream kullanabilirsiniz. Anlayabildiğim kadarıyla, bu tam olarak istediğin şeyi yapar. 1.6 kullanamazsanız java.util.zip.Deflater'u kullanarak DeflaterInputStream'u yeniden tazelemelisiniz. Verileri BLOB'dan geri okurken, orijinal verileri geri almak için bir filtre olarak InflaterInputStream kullanın.

+0

Bu Sınıftan haberdar değildim. Bu doğru çözüm gibi görünüyor. Ne yazık ki, Blob uygulaması uzunluğu kullanır ve DeflaterInputStream her zaman 0 ya da 1 döndürür. Bence uzunluğa ihtiyacım var demek ne olursa olsun veriyi blob içine doğrudan sıkıştırıp aktaramayacağım anlamına geliyor. sıkıştırma tamamlanana kadar uzunluk bilinemez. –

+0

@Brian Yani blob oluştururken giriş akışı ile birlikte bir uzunluk geçirmeniz gerekir? InputStream üzerinde uzunluk yöntemi yoktur, sadece akım uzunluğundan tamamen farklı bir şey anlamına gelen mevcut bir yöntemdir. –

+0

available(), orijinal giriş akışında (bir http gönderisinden gelen) doğru uzunluğu döndürüyor gibi görünüyor. Belki de içerik uzunluğuna dayanır ya da belki de onu almadan önce tüm akışı akış yukarı bir yerde okuyordur. Ama bu, sıkıştırdığımda yardımcı olmaz, çünkü tüm akışı zaten işleyene kadar sıkıştırılmış boyutu bilmeyeceğim, bu noktada bellekte bu noktada bir bayt [] haline getirebilirim. –

İlgili konular