Java 使用ApacheBzip2库的NullPointerException

Java 使用ApacheBzip2库的NullPointerException,java,Java,我正在使用ApacheAnt的BZip2压缩库。有关文件载于— 当我运行代码时,我一直会遇到这个错误- Exception in thread "main" java.lang.NullPointerException at org.apache.tools.bzip2.CBZip2InputStream.bsR(CBZip2InputStream.java:323) at org.apache.tools.bzip2.CBZip2InputStream.bsGetUCh

我正在使用ApacheAnt的BZip2压缩库。有关文件载于—

当我运行代码时,我一直会遇到这个错误-

   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)
我的源代码是-

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

}

非常感谢您的帮助。

您正在打开一个指向alicea.txt的FileOutputStream

FileOutputStream fout = new FileOutputStream("alicea.txt");
此OutputStream在代码中从未关闭,但在错误行中,您打开了同一文件上的FileInputStream:

InputStream fileInputStream = new FileInputStream("alicea.txt");
CBZip2InputStream cin = new CBZip2InputStream(fileInputStream);
IMHO当您在一个文件上有一个打开的FileOutputStream时,您不能在同一个文件上打开一个FileInputStream。这可能就是FileInputStream为NULL并引发异常的原因

更新: CBZip2InputStream中有一个已知的bug和一个2002年描述的解决方案(仍然可以在中找到),它仍然存在。您必须下载java类,并且不能使用现成的build.jar存档。更改CBZip2InputStream.java的initialize()方法中的以下行:

原始代码(从第213行开始):

private void initialize(){
char magic3,magic4;
magic3=bsGetUChar();
magic4=bsGetUChar();
如果(magic3!=“h”| magic4<'1'| magic4>'9'){
bFinishedWithStream();
streamEnd=true;
返回;
}
setDecompressureSizes(magic4-'0');
computedCombinedCRC=0;
}
将此更改为:

private void initialize(){
char magic1,magic2;
char magic3,magic4;
magic1=bsGetUChar();
magic2=bsGetUChar();
magic3=bsGetUChar();
magic4=bsGetUChar();
如果(magic1!='B'| magic2!='Z'| magic3!='h'| magic4<'1'| magic4>'9'){
bFinishedWithStream();
streamEnd=true;
返回;
}
setDecompressureSizes(magic4-'0');
computedCombinedCRC=0;
}
上次更新:
我刚刚回顾了ApacheAnt的svn;主干中的错误已修复。但尽管如此,仍然有很多很多下载包含这个bug。我还意外地下载了一个旧版本来测试您的问题。

如何阻止您在NPE(或CBZip2InputStream行323)上设置断点,以查看哪个变量(很可能是CBZip2InputStream的成员)为空?这应该会给你一些线索,而不是让我们猜测。@Erik:“当你在一个文件上有一个打开的FileOutputStream时,你不能在同一个文件上打开一个FileInputStream”--想提供一个参考来说明为什么这可能是真的吗?我添加了fout.close();并将alicea.txt的权限改为读、写、执行。但这并没有解决问题:(@aix:将尝试为您找到一个引用。但我一生中从未见过这种情况。您通常从一个实例而不是几个实例中打开一个文件描述符到一个文件。@Erik-CBZip2OutputStream将压缩该文件,我确实在我的目录中看到一个压缩文件。压缩文件的名称是alicea.txt。在第二步中,我是tr要解压缩文件,请查看解压缩文件的内容是否与原始文件的内容完全相同-alice29.txt我认为CBZip2InputStream应该解压缩file@AshishAgarwal如果您能接受我的答案作为解决方案,那将是非常好的(单击我答案计数器下的复选标记),这样其他人就可以看到,这个问题得到了回答。
InputStream fileInputStream = new FileInputStream("alicea.txt");
CBZip2InputStream cin = new CBZip2InputStream(fileInputStream);
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;
}
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;
}