【问题标题】:Write and read byte[] from file从文件中写入和读取 byte[]
【发布时间】:2011-01-15 10:03:09
【问题描述】:

我正在寻找一些简单的东西(最好没有外部库)来从文件中写入和加载 byte[]。或多或少类似于 [Python's pickle][1]。

byte[] bytes = new byte[10];
ByteBuffer bbuf = new ByteBuffer.allocate(bytes.length);
bbuf.wrap(bytes);   // edited due to Jon Skeet's answer
CharBuffer cbuf = bbuf.asCharBuffer();
cbuf.put("t");
FileOutputStream test = new FileOutputStream("somebytes");
test.write(bytes);
test.close();

问题似乎是我无法从这样的文件中读取对象结构。此外,在十六进制编辑器中,文件“somebytes”仅包含一对或 0。因此,FileOutputStream 似乎没有将任何内容(“t”或等效字节)放入其中。

[1]http://wiki.python.org/moin/UsingPickle

【问题讨论】:

    标签: java standard-library object-serialization


    【解决方案1】:

    您分配了一个 sizebytes 的字节缓冲区,但这并不意味着字节缓冲区与字节数组相关联。您可以使用ByteBuffer.wrap 包装一个字节数组。

    这是对您的代码的最小更改,确实t 写入文件:

    byte[] bytes = new byte[10];
    ByteBuffer bbuf = ByteBuffer.wrap(bytes);
    CharBuffer cbuf = bbuf.asCharBuffer();
    cbuf.put("t");
    FileOutputStream test = new FileOutputStream("somebytes");
    test.write(bytes);
    test.close();
    

    请注意,对于实际代码,您应该使用 try/finally 块来确保文件始终关闭,而不管异常情况。

    但是,这距离序列化还有很长的路要走。 Java 确实有自己的二进制序列化 - 请参阅 ObjectOutputStreamObjectInputStream。然而,就我个人而言,我通常会避免这种序列化,因为面对类的更改它可能非常脆弱。还有各种其他的序列化方法,例如使用 Thrift 或 Protocol Buffers 进行二进制序列化,或序列化为 XML、JSON 或其他一些人类可读的格式。

    【讨论】:

    • 您的文件将有一个字节用于 't',然后是 9 个空的 '\0' 字节。不确定那是什么意思。
    • @Peter:我只是想获取将一些数据写入磁盘的原始代码。鉴于最终目标是更完整的序列化,我在答案的最后部分讨论了这一点。
    【解决方案2】:

    你可以

    seek(position)
    b = read(length)
    

    然后 b 将是您长度的字节数组。

    抱歉 - 重读时您是在寻找写作,而不是阅读。

    【讨论】:

      【解决方案3】:

      同样的事情的一个更简单的版本是。

      byte[] bytes = new byte[10];
      bytes[1] = 't';
      
      FileOutputStream test = new FileOutputStream("somebytes");
      test.write(bytes);
      test.close();
      

      有很多关于如何从网络上的文件中读取/写入字节[] 的示例。试试谷歌。

      【讨论】:

      • 虽然确实可以编译,但这只是偶然的,因为您使用的 char 常量恰好在一个字节的范围内 - 试图将 characters 存储在一个字节中像这样直接使用数组(而不是使用任何类型的特定编码,甚至是包装字节数组的 char 缓冲区)是一个非常糟糕的主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多