我正在使用Apache Ant的BZip2压缩库.文档见 - http://javadoc.haefelinger.it/org.apache.ant/1.7.1/org/apache/tools/bzip2/CBZip2InputStream.html
我运行代码时不断收到此错误 -
Exception in thread "main" java.lang.NullPointerException
at org.apache.tools.bzip2.CBZip2InputStream.bsR(CBZip2InputStream.java:323)
at org.apache.tools.bzip2.CBZip2InputStream.bsGetUChar(CBZip2InputStream.java:341)
at org.apache.tools.bzip2.CBZip2InputStream.initBlock(CBZip2InputStream.java:230)
at org.apache.tools.bzip2.CBZip2InputStream.<init>(CBZip2InputStream.java:178)
at org.apache.tools.bzip2.bzipCompression.main(bzipCompression.java:37)
Run Code Online (Sandbox Code Playgroud)
错误在线 -
**CBZip2InputStream cin = new CBZip2InputStream(fileInputStream);**
Run Code Online (Sandbox Code Playgroud)
我的源代码是 -
public static void main(String[] args) throws IOException, NullPointerException {
// TODO Auto-generated method stub
FileReader inFile = new FileReader("alice29.txt");
BufferedReader buff = new BufferedReader(inFile);
FileOutputStream fout = new FileOutputStream("alicea.txt");
fout.write("BZ".getBytes());
CBZip2OutputStream czout = new CBZip2OutputStream (fout);
String message = buff.readLine(); // read first line
while(message!=null){
byte[] input = message.getBytes();
czout.write(input);
message = buff.readLine();
}
czout.flush();
czout.close();
InputStream fileInputStream = new FileInputStream("alicea.txt");
CBZip2InputStream cin = new CBZip2InputStream(fileInputStream);
FileOutputStream decOut = new FileOutputStream("decompressedAlice.txt");
byte[] buf = new byte[100000];
int len;
while((len = cin.read(buf))>0){
decOut.write(buf, 0, len);
}
decOut.close();
cin.close();
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你的帮助.
您正在打开alicea.txt的FileOutputStream
FileOutputStream fout = new FileOutputStream("alicea.txt");
Run Code Online (Sandbox Code Playgroud)
此OutputStream永远不会在您的代码中关闭,但在错误行中,您在同一文件上打开FileInputStream:
InputStream fileInputStream = new FileInputStream("alicea.txt");
CBZip2InputStream cin = new CBZip2InputStream(fileInputStream);
Run Code Online (Sandbox Code Playgroud)
恕我直言,当您在文件上打开FileOutputStream时,无法在同一文件上打开文件InputStream.这可能是为什么你的FileInputStream为NULL并抛出异常的原因.
更新: CBZip2InputStream中存在已知错误以及2002年描述的解决方案(仍可在MarkMail中找到),该解决方案仍然存在.您必须下载java-classes,并且可能不使用ready build .jar存档.在CBZip2InputStream.java的initialize()方法中更改以下行:
原始代码(从第213行开始):
Run Code Online (Sandbox Code Playgroud)private void initialize() { char magic3, magic4; magic3 = bsGetUChar(); magic4 = bsGetUChar(); if (magic3 != 'h' || magic4 < '1' || magic4 > '9') { bsFinishedWithStream(); streamEnd = true; return; } setDecompressStructureSizes(magic4 - '0'); computedCombinedCRC = 0; }
将其更改为:
Run Code Online (Sandbox Code Playgroud)private void initialize() { char magic1, magic2; char magic3, magic4; magic1 = bsGetUChar(); magic2 = bsGetUChar(); magic3 = bsGetUChar(); magic4 = bsGetUChar(); if (magic1 != 'B' || magic2 != 'Z' | magic3 != 'h' || magic4 < '1' || magic4 > '9') { bsFinishedWithStream(); streamEnd = true; return; } setDecompressStructureSizes(magic4 - '0'); computedCombinedCRC = 0; }
最后更新: 我刚刚审阅了apache ant的svn; 主干中的错误是固定的.但尽管如此,仍有许多下载仍包含此错误.我还意外地下载了一个旧版本来测试你的问题.