2013-03-02 81 views
0

我有一个字节数组,它包含我需要写入文件并读回字节数组的负数。最佳编码方式

想象一下,我有10个长度为128的字节数组,包括负数。

将十个数组写入同一个文件的最佳方式是什么?这样我可以读取该文件并再次创建相同的十个字节数组?我知道总是有128的长度,所以这不是问题。

我目前尝试把它们全部放到一个字符串中,用base 64进行编码,然后写入文件。但是,当我读取文件并对其进行解码时,似乎没有正确解释它(第一个数组是按顺序的,另一个不是)。

任何想法?

+1

向我们展示您的尝试。也许我们可以解决它。 – 2013-03-02 08:09:00

回答

3

只是其中直接写出来的OutputStream - 有没有必要对其进行编码:阅读(与InputStream)时

// Or wherever you get them from 
byte[][] arrays = new byte[10][128]; 
... 

for (byte[] array : arrays) { 
    outputStream.write(array); 
} 

然后:

byte[][] arrays = new byte[10][]; 
for (int i = 0; i < arrays.length; i++) { 
    arrays[i] = readExactly(inputStream, 128); 
} 

... 

private static byte[] readExactly(InputStream input, int size) throws IOException { 
    byte[] ret = new byte[size]; 
    int bytesRemaining = size; 
    while (bytesRemaining > 0) { 
     int bytesRead = input.read(ret, size - bytesRemaining, bytesRemaining); 
     if (bytesRead == -1) { 
      throw new IOException("Ran out of data"); 
     } 
    } 
    return ret; 
} 

请注意,您不能只发出10个电话给InputStream.read,并假设它每次都会读取128个字节。

+0

无需对它们进行编码 - 您确定吗?当我写它们时,很多负数字节值变成了'?' (63)。 – 2013-03-02 08:15:08

+0

@BobbyBrown:只有当你试图在文本编辑器中查看它们。你真的*需要*来做到这一点吗?这是二进制数据 - 如果您想查看文件内容,请使用二进制文件编辑器。如果他们仍然*变成63,这表明数据在你写出之前已经损坏 - 这几乎可以肯定是由于将它转换为前面代码中某个字符串的原因。我的代码假设你已经得到了正确的数据开始... – 2013-03-02 08:19:49

+0

我必须已经将某些东西转换为字符串的某处。谢谢你的提示,我会在晚些时候看看 - 这是晚了,我需要去睡觉。 – 2013-03-02 08:27:22