Java GZIP吃新线

Java GZIP吃新线,java,gzip,gzipinputstream,gzipoutputstream,Java,Gzip,Gzipinputstream,Gzipoutputstream,我有以下压缩和解压缩字符串的代码 public static byte[] compress(String str) { try { ByteArrayOutputStream obj = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(obj); gzip.write(str.getBytes("UTF-8"));

我有以下压缩和解压缩字符串的代码

public static byte[] compress(String str)
{
    try
    {
        ByteArrayOutputStream obj = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();
        return obj.toByteArray();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    return null;
}

public static String decompress(byte[] bytes)
{
    try
    {
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
        BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
        StringBuilder outStr = new StringBuilder();
        String line;
        while ((line = bf.readLine()) != null)
        {
            outStr.append(line);
        }
        return outStr.toString();
    }
    catch (IOException e)
    {
        return e.getMessage();
    }
}
我在windows上压缩成字节数组,然后通过套接字将字节数组发送到linux并在那里解压缩。然而,在解压后,我的所有换行符似乎都消失了。
所以我认为问题在于linux与windows之间的关系。然而,我尝试在windows上编写一个使用它的简单程序,发现换行符仍然没有出现。

有人能解释一下是什么原因引起的吗?我想不出任何解释。

我想问题在于:

while ((line = bf.readLine()) != null)
    {
        outStr.append(line);
    }
readLine
see是换行符,但不包括在
line
see的返回值中

问题可能比你想象的还要严重

readLine()
获取所有字符,包括但不包括换行符(或一些返回和换行符)或文件结尾。所以你不知道最后一行的结尾是否有新行

这可能无关紧要,如果是这样,您可以在另一个附加之后添加:

outStr.append('\n');
某些文件可能会在文件末尾附加一行

如果有关系,则需要使用
read()
,然后输出接收到的所有字符。在这种情况下,您可能会遇到臭名昭著的“行尾是什么?”问题,您提到了Windows、Linux和MacOS之间的问题,以及它们使用不同的返回字符和新行字符组合来结束行的方式。

不是GZIP在“吃”新行

这是一个代码:

    while ((line = bf.readLine()) != null)
    {
        outStr.append(line);
    }
readLine()。然后将其附加到
outtr
。。。无需更换剥离的线路终端

但即使更换了线路终端,也不能保证保留使用的实际线路终端序列。。。如果你那样做的话


我建议您将
readLine()
调用替换为
read()
调用;i、 e.每次读取并缓冲一个字符的数据。它同时解决了两个问题。它甚至可能更快,因为您避免了装配线串的不必要开销。

您是对的
read()
刚刚失败,但在我的例子中,
.append(“\n”)
可以工作,如果我碰巧得到一个额外的换行符,我也可以,但到目前为止还没有。非常抱歉,李是第一个。此外,我还尝试使用read(),不幸的是,由于不同的操作系统使用不同的字符,当我通过套接字将数据从一个操作系统传输到另一个操作系统时,换行符确实会被吃掉。谢谢你的帮助:)这个解决方案是正确的,我真的很喜欢。