gpt4 book ai didi

java - Gzip 压缩和从 python 到 java 的 http post

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:48 25 4
gpt4 key购买 nike

我想将 gzip 压缩数据从 python 发送到 java,并且我想将其作为 BLOB 存储在数据库中。然后我想在java中gzip解压该BLOB。所以我想知道如何在 python 中发布 BLOB 以及如何在 java 中读取 BLOB。我在下面给出了我的 python 和 java 代码。在我的代码中,我用 gzip 压缩 python 中的字符串并将压缩数据存储在文件中。然后我用 java 读取该文件并使用 GZIPInputStream 解压缩它。但我遇到了以下异常。

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、4 8, 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、-6 5、-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 代码的输入,它就可以正常工作。所以请帮助我了解如何在 python 中发布 blob(压缩数据)以及如何在 java 中读取该压缩数据以对其进行解压缩。

这是python中的压缩代码:

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();
}
}

最佳答案

您无法直接将压缩数据读取为字符串。您在 readCompressedData 方法中所做的是将压缩数据读取为文字(这会导致错误的字符串),然后获取其字节(在方法 main 中)。执行此操作后,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构建,不需要先获取字节。只需使用BufferedReader读取用FileInputStream构建的GZIPInputStream即可。

有一个解决方案:

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

关于java - Gzip 压缩和从 python 到 java 的 http post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39077711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com