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

Posted

技术标签:

【中文标题】Java - 尝试写入文件 2 次或更多次时出现 BufferOverflowException【英文标题】:Java - BufferOverflowException when trying to write to a file 2 or more times 【发布时间】:2017-02-17 15:33:13 【问题描述】:

我正在尝试编写一个一次可以占用 1 位的程序,然后在“收集”16 位后将 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 方法仅用于测试上述方法。 “out”变量是一个 FileOutputStream,“byteholder”是一个保存二进制代码的字符串,文件“test”是我在 Eclipse 项目目录中的一个随机空文件。

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

还有额外的问题!每当我成功运行我的测试代码时,我都可以看到我的“测试”文件中的文件大小没有改变(仍然是 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)

【问题讨论】:

你有堆栈跟踪吗? @SteveSmith 哎呀,谢谢你提醒我。我现在发布了堆栈跟踪。 【参考方案1】:

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

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

如果由于签名问题(1001011010010110 被认为超过了 short 的值)使用 short 时遇到问题,您可以将 a 保留为 int,但将值写入 putShort((short)a) .

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

【讨论】:

在尝试使用 Int 之前,我确实尝试过使用 Short。但是,当我使用 Short 时,出现“NumberFormatException: Value out of range. Value:"1001011010010110" Radix:2" 错误。知道为什么吗? 查看我的编辑。您可以继续使用int,但将其作为short 写入缓冲区。 感谢修复!只是一个小问题......我对Java(和一般编程)很陌生。究竟应该将什么写入我的文件?我的文件应该显示什么?现在它只显示 2 行,如下所示:“--​​”(不带引号 ofc)。文件大小现在显示 2 个字节,所以我想我做得对... 它显示您写入文件的位,解释为单字节字符。如果您打印出Integer.toBinaryString('-'),您应该会看到您编写的原始位模式。【参考方案2】:

至于为什么你的输出文件是空的:

您第一次调用 write() 方法是在您尝试添加第 17 位时(顺便说一句,将其松开)。

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

【讨论】:

啊,谢谢现在修复了那个部分。不过仍然会收到 BufferOverflowException... Nvm 现已修复! :)

以上是关于Java - 尝试写入文件 2 次或更多次时出现 BufferOverflowException的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 HD 上写入文件时出现“(只读文件系统)”

尝试在 Android 中将文件写入 sdcard 时出现 FileNotFoundException(权限被拒绝)

写入原始文件时出现 FileNotFoundException

使用 Spark Java 在 Big Query 中写入 Date 数据类型时出现问题

写入文本文件时出现“文件正在使用”错误

玩游戏时出现尝试读取或写入受保护的内存如何处理