2016-08-22 5 views
1

Я хочу, чтобы http отправил gzip сжатые данные из python в java, и я хочу сохранить его как BLOB в базе данных. Затем я хочу, чтобы gzip распаковывал этот BLOB в java. Поэтому я хочу знать, как выставить BLOB в python и как читать BLOB в java. Я дал свой код python и java ниже. В моем коде gzip сжимает строку в python и сохраняет сжатые данные в файле. Затем я прочитал этот файл в java и распакую его с помощью GZIPInputStream. Но я получаю следующее исключение.Gzip compression и http post from python to java

java.io.IOException: Not in GZIP format 
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:154) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:75) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:85) 
    at GZipFile.gunzipIt(GZipFile.java:60) 
    at GZipFile.main(GZipFile.java:43) 

Если я напечатать массив байтов сжатых данных в Python Я получаю

[31, 139, 8, 0, 254, 213, 186, 87, 2, 255, 203, 72, 205, 201, 201, 231, 229, 42, 207, 47, 202, 73, 1, 0, 66, 102, 86, 48, 12, 0, 0, 0]

Если я прочитал и распечатал это сжатые данные из этого файла в java Я получаю как

[31, -17, -65, -67, 8, 0, -17, -65, -67, -42, -70, 87, 2, - 17, -65, -67, -17, -65, -67, 72, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, - 65, -67 , -17, -65, -67, 42, -17, -65, -67, 47, -17, -65, -67, 73, 1, 0, 66, 102, 86, 48, 12, 0, 0, 0]

Вы видите, что есть разница. Если я дам напечатанный массив байтов в python в качестве ввода кода Java, он отлично работает. Поэтому, пожалуйста, помогите мне узнать, как публиковать blob (сжатые данные) в python и как читать сжатые данные в java для его распаковки.

Это код сжатия в питоне:

import StringIO 
import gzip 
import base64 
import os 


m='hello'+'\r\n'+'world' 

out = StringIO.StringIO() 
with gzip.GzipFile(fileobj=out, mode="wb") as f: 

    f.write(m.encode('utf-8')) 
print list(array.array('B',out.getvalue())[:]) 
f=open('comp_dump','wb') 
f.write(out.getvalue()) 
f.close() 

Это код декомпрессия в Java:

//$Id$ 

import java.io.*; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.GZIPInputStream; 
import javax.xml.bind.DatatypeConverter; 
import java.util.Arrays; 

public class GZipFile 
{ 


public static String readCompressedData()throws Exception 
{ 
     String compressedStr =""; 
     String nextLine; 
     BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("comp_dump"))); 
     try 
     { 
       while((nextLine=reader.readLine())!=null) 
       { 
         compressedStr += nextLine; 
       } 
     } 
     finally 
     { 
       reader.close(); 
     } 
     return compressedStr; 
} 

public static void main(String[] args) throws Exception 
{ 
     GZipFile gZip = new GZipFile(); 
     byte[] contentInBytes = readCompressedData().getBytes("UTF-8"); 

     System.out.println(Arrays.toString(contentInBytes)); 
     String decomp = gZip.gunzipIt(contentInBytes); 
     System.out.println(decomp); 
} 

/** 
* GunZip it 
*/ 
public static String gunzipIt(final byte[] compressed){ 

     byte[] buffer = new byte[1024]; 
     StringBuilder decomp = new StringBuilder() ; 

     try{ 

       GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(compressed)); 

       int len; 
       while ((len = gzis.read(buffer)) > 0) { 

         decomp.append(new String(buffer, 0, len)); 

       } 

       gzis.close(); 

     }catch(IOException ex){ 
       ex.printStackTrace(); 
     } 
     return decomp.toString(); 
} 
} 

ответ

0

Вы не можете напрямую прочитать сжатые данные в строку. Что вы сделали в методе readCompressedData, это чтение сжатых данных в литерал (что приводит к неправильной строке), а затем получить его байты (в основном методе). После вы делаете это, contentInBytes на самом деле не байты, хранящиеся в файле.

При попытке создать строку с байтами, которая не может быть преобразована в String. Байты, представляющие строку, различны.

Например:

 byte bytesBefore[] = {-1,-2,65,76,79,80}; 
     try { 
      String str = new String(bytesBefore); 
      byte bytesAfter[] = str.getBytes(); 
      System.out.println("str is " + str); 
      System.out.println("after"); 
      for(Byte b : bytesAfter){ 
       System.out.print(" " + b); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

ВЫВОД:

str is ��ALOP 
after 
-17 -65 -67 -17 -65 -67 65 76 79 80 

Поскольку байты -1 и -2 здесь не может быть преобразован в строку, когда вам новую строку с bytesBefore, байты, хранится в памяти для str, это bytesAfter, которые изменяют -1 и -2 до -17 -65 -67 -17 -65 -67.

На самом деле, GZIPInputStream может быть построен с FileInputStream, нет необходимости, чтобы получить байты first.Just используют BufferedReader читать GZIPInputStream, который построен с FileInputStream.

Существует решение:

import java.io.*; 
import java.util.zip.GZIPInputStream; 

public class GZipFile { 
    public static void main(String[] args) throws Exception { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new GZIPInputStream(new FileInputStream(
         "comp_dump")), "UTF-8")); 
     StringBuffer sb = new StringBuffer(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line).append("\r\n"); 
     } 
     System.out.println(sb.toString()); 
    } 
} 

ВЫВОД:

hello 
world 
+0

Это решение отлично работает. Я изменил свой код, как показано ниже, Файл файла = новый файл («comp_dump»); byte [] bs = новый байт [(int) file.length()]; FileInputStream fis = new FileInputStream (файл); int len ​​= fis.read (bs); Я передам байтовый массив bs в качестве входа в GZIPInputStream для распаковки. Но в этом мы даем файл как вход. Я хочу опубликовать сжатые данные в java. Затем мы должны прочитать эти данные как байты на стороне java. Итак, как читать опубликованные сжатые данные как байты в java и его можно сохранить как какой тип в mysql. Может ли он быть сохранен как BLOB в mysql? –

+0

Да, BLOB в порядке. В качестве входа используйте GZIPInputStream и байты BLOB. – tianwei

1

Вы проверили это: gzip a file in Python?

Я думаю, что ваша строка

m='hello'+'\r\n'+'world' 

, возможно, вызывает некоторые проблемы со всем процессом ...

Рассматривали ли вы заменить его с т = «привет \ г \ nworld», используя вместо двойных кавычек?

+0

Нет, это бросает же исключение –

 Смежные вопросы

  • Нет связанных вопросов^_^