Java 从文件中写入和读取字节[]

Java 从文件中写入和读取字节[],java,standard-library,object-serialization,Java,Standard Library,Object Serialization,我正在寻找一些简单的东西(最好没有外部库)来从文件中写入和加载字节[]。或多或少类似于[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.

我正在寻找一些简单的东西(最好没有外部库)来从文件中写入和加载字节[]。或多或少类似于[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]

您已分配大小为
字节的字节缓冲区,但这并不意味着字节缓冲区与字节数组关联。可以使用
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确实有自己的二进制序列化—请参阅和。然而,就我个人而言,我通常避免这种序列化,因为它在面对类的更改时可能非常脆弱。还有其他多种序列化方法,例如使用Thrift或协议缓冲区进行二进制序列化,或序列化为XML、JSON或其他人类可读格式。

您已分配了大小为
字节的字节缓冲区,但这并不意味着字节缓冲区与字节数组相关联。可以使用
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确实有自己的二进制序列化—请参阅和。然而,就我个人而言,我通常避免这种序列化,因为它在面对类的更改时可能非常脆弱。还有其他各种序列化方法,例如使用Thrift或协议缓冲区进行二进制序列化,或者序列化为XML、JSON或其他人类可读的格式。

您可以

seek(position)
b = read(length)
那么b将是一个长度为您的字节数组

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

您可以

seek(position)
b = read(length)
那么b将是一个长度为您的字节数组


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

同样的事情的更简单版本是

byte[] bytes = new byte[10];
bytes[1] = 't';

FileOutputStream test = new FileOutputStream("somebytes");
test.write(bytes);
test.close();

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

同样的事情更简单的版本是

byte[] bytes = new byte[10];
bytes[1] = 't';

FileOutputStream test = new FileOutputStream("somebytes");
test.write(bytes);
test.close();

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

您的文件将有一个字节代表“t”,后面是9个空的“\0”字节。彼得:我只是想得到原始代码,把一些数据写到磁盘上。考虑到最终的目标是实现更完整的序列化,我在答案的最后一部分讨论了这一点。您的文件将有一个“t”字节,后跟9个null“\0”字节。彼得:我只是想得到原始代码,把一些数据写到磁盘上。考虑到最终的目标是实现更完整的序列化,我在答案的最后一部分讨论了这一点。虽然这确实是编译的,但这只是一种偶然现象,因为您使用的是恰巧在字节范围内的char常量,试图像这样直接将字符存储在字节数组中(而不是使用任何类型的特定编码,甚至是包装字节数组的字符缓冲区)是一个非常糟糕的主意。虽然这样做是编译的,但这只是偶然的,因为您使用的字符常量恰好在一个字节的范围内-试图像这样直接在字节数组中存储字符(而不是使用任何特定的编码,甚至是包装字节数组的字符缓冲区)是一个非常糟糕的主意。