Java - 尝试写入文件2次或更多次时的BufferOverflowException

时间:2017-02-17 15:33:14

标签: java file exception byte bytebuffer

我正在尝试编写一个程序,一次可以占用1位,然后在收集了16位并且#34;之后将2个字节写入文件。

以下是基本代码:

public void addBit(int bit) throws IOException{
    if(this.byteholder.length() < 16){
        this.byteholder += "" + bit;
    }
    else{
        write();
    }
}

public void write() throws IOException{
    if(this.byteholder.length() == 16){
        System.out.println(this.byteholder);
        int a = Integer.parseInt(byteholder, 2);
        System.out.println(Integer.toBinaryString(a));
        ByteBuffer bytes = ByteBuffer.allocate(2).putInt(a);
        byte[] byteArray = bytes.array();

        out.write(byteArray);
        out.flush();
        this.byteholder = "";
    }


}

public static void main(String[] args) {
    try {
        File f = new File("test");
        BitFileWriter out = new BitFileWriter(f);
        for(int i=0; i<2; i++){
            out.addBit(1);
            out.addBit(0);
            out.addBit(0);
            out.addBit(1);
            out.addBit(0);
            out.addBit(1);
            out.addBit(1);
            out.addBit(0);
            out.addBit(1);
            out.addBit(0);
            out.addBit(0);
            out.addBit(1);
            out.addBit(0);
            out.addBit(1);
            out.addBit(1);
            out.addBit(0);
        }

        out.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

}

main方法仅用于测试上述方法。 &#34; out&#34; variable是一个FileOutputStream,&#34; byteholder&#34;是一个String,它包含二进制代码和文件&#34; test&#34;是我在Eclipse项目目录中的随机空文件。

我得到的问题是,如果我不止一次运行我的测试代码(多次循环addbit代码),我得到一个BufferOverflowException,我不明白为什么。我不确定如何正确使用ByteBuffer,但我需要它能够一次写入2个字节到文件。有人可以帮忙吗?感谢。

还有奖金问题!每当我成功运行我的测试代码时,我都可以看到我的测试文件大小&#34;测试&#34;文件未更改(仍然表示0字节)。为什么?。我正在运行Windows 10顺便说一句。

编辑: 这是我的堆栈跟踪:

Exception in thread "main" java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Unknown Source)
at java.nio.HeapByteBuffer.putInt(Unknown Source)
at CompPck.BitFileWriter.write(BitFileWriter.java:30)
at CompPck.BitFileWriter.addBit(BitFileWriter.java:21)
at CompPck.BitFileWriter.main(BitFileWriter.java:66)

2 个答案:

答案 0 :(得分:1)

ByteBuffer.allocate(2).putInt(a);

您为一个4字节的int分配2个字节。你期望发生什么?如果要使用16位值,请使用short(和putShort)。

如果由于签名问题(1001011010010110被认为超过短片的价值)而导致使用短片问题,您可以将a保持为int,但请使用putShort((short)a)写下该值。

至于您的文件空白,您可能无法在close()方法中正确关闭资源,或者您忘记将 缓冲区写入文件

答案 1 :(得分:0)

至于输出文件为空的原因:

第一次调用write()方法时,您尝试添加第17位(并将其松散)。

如果只进行一次迭代(即只尝试写入16位),则永远不会调用write方法。因此,BufferOverflowException没有显示 - 但也没有任何内容写入文件。