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