gpt4 book ai didi

java - GZIP 吃掉换行符

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:43 31 4
gpt4 key购买 nike

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

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上压缩成字节数组,然后通过socket把字节数组传到linux上解压。然而,在解压缩后,我所有的换行符似乎都消失了。
所以我认为问题出在 linux 与 windows 的关系上。但是我尝试在使用它的 Windows 上编写一个简单的程序,发现换行符仍然没有。
任何人都可以阐明是什么原因造成的吗?我想不出任何解释。

最佳答案

我觉得问题出在这里:

while ((line = bf.readLine()) != null)
{
outStr.append(line);
}

readLine 看到的是换行符,但不将其包含在 line 的返回值中

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

readLine() 获取所有字符,但不包括换行符(或各种返回和换行符)或文件末尾。所以你不知道你得到的最后一行是否在末尾有一个换行符。

这可能无关紧要,如果是这样,您可以在其他附加项之后添加:

outStr.append('\n');

有些文件可能会在文件末尾有一个额外的行。

如果确实如此,您将需要使用 read() 然后输出您收到的所有字符。在那种情况下,您可能会得到臭名昭著的“行尾是什么?”您在 Windows、Linux 和 MacOS 之间提到的问题,以及它们使用不同的回车符和换行符组合来结束行的方式。

关于java - GZIP 吃掉换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300441/

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