保存字节数组中字节数组的长度

时间:2014-01-02 01:23:07

标签: java android file-management bytearrayoutputstream bufferedoutputstream

我在BufferedOutputStream中写了三次:

b1 = baos1.toByteArray();  
b2 = baos2.toByteArray();  

bos.write(b1);
bos.write(b2);
bos.write(b1.length);

System.out.println(b1.length);
System.out.println(b2.length);

bos.flush();
bos.close();

我想在另一个类中获取值write(b1.length),但是我得到的值与第一个* .println()不同。

System.out.println(aux.length); // The entire stream (b1+b2+b1.length)
System.out.println(aux[aux.length - 1]);

例如:

Println 1 - > 123744

Println 2 - > 53858

Println 3 - > 177603

Println 4 - > 96

在这种情况下,println1和println4应返回相同的大小。我做错了什么?

我已检查写过1字节(177603-123744-53858 = 1),即b1.length字节。

有人可以帮我正确写出第一个字节数组的大小吗?

3 个答案:

答案 0 :(得分:3)

Java中的单个byte是带有范围-128..127的带符号值。这对于您尝试存储的值是不够的。

您应该至少写一个4字节的整数来管理长度Integer.MAX_VALUE

该值会被截断为1个字节,这很容易看作

123744 == 0x1E360
0x1E360 & 0xFF == 0x60
0x60 = 96

答案 1 :(得分:0)

我已经解决了这个问题:

bos.write(ByteBuffer.allocate(4).putInt(b2.length).array());

而不是:

bos.write(b1.length);

现在它可以工作,我可以检索长度。

答案 2 :(得分:0)

在DataOutputStream中包装BufferedOutputStream并使用其write(byte[])writeInt(int)方法。