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的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Android 中将文件写入 sdcard 时出现 FileNotFoundException(权限被拒绝)
写入原始文件时出现 FileNotFoundException