我正在尝试编写一个程序,一次可以占用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)
答案 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
没有显示 - 但也没有任何内容写入文件。