我正在尝试在Java中实现侦听器,将侦听系统。in,读取使用Deflate压缩的数据,解压缩数据,然后将其写入System.out。
我想处理流到System的数据。在实时,所以我需要保持套接字连接和输入流打开,同时解压缩数据。逐行读出解压缩数据也很重要。我已经实现了以下代码来从压缩流中读取并写入新的输出流:
InputStream inputStream = System.in;
InflaterInputStream inflaterInputStream = new InflaterInputStream(inputStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(inflaterInputStream));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
我正在用以下Linux命令测试代码:
cat file_with_compressed_data.txt | java Inflate > outputFile.txt
充气是我的系统。在监听器类。但是,当运行此命令时,我收到以下异常:
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:223)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:158)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at Inflate.main(Inflate.java:30)
解压缩似乎正在工作,因为outputFile.txt包含了大部分原始解压缩数据。但是,原始文件中的outputFile.txt中缺少一些行。
我不明白为什么会抛出这个异常。有没有其他方法可以在不关闭输入流的情况下实时解压缩压缩数据?
我的java版本是: java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03)
Java HotSpot(TM) 64-bit Server VM (build 20.8-b03, mixed mode)
可以使用以下命令创建压缩文件:
DeflaterOutputStream out = new DeflaterOutputStream(System.out);
int c;
while ((c = System.in.read()) != -1) {
out.write(c);
}
out.flush();
out.close();
经过一番调查,我找到了解决这个问题的办法。看起来好像是BufferedReader导致了问题,尽管我必须承认我仍然不明白为什么。我用StringBuilder替换了BufferedReader来生成:
InputStream inputStream = System.in;
InflaterInputStream inflaterInputStream = new InflaterInputStream(inputStream);
StringBuilder toReturn = new StringBuilder();
int c;
while ((c = inflaterInputStream.read()) != -1) {
toReturn.append((char) c);
if ((char) c == 'n') {
System.out.println(toReturn.toString());
toReturn.setLength(0);
}
}