我可以使用Java在同一文件中操作混合文本/二进制数据吗?

时间:2013-12-03 22:00:28

标签: java file io inputstream

据我了解,Java中有两种类型的File I / O apis 文本导向和二元导向 我无法理解的是,当我们想要创建一个混合了文本和二进制数据的文件时,我们会使用什么 例如。将变量长度记录保存在文件中的简单情况,其中每个记录(unicode文本)具有2个字节(short)的整数,用于指定记录的大小。
这可能吗?或者我只能操作单一类型的文件?仅文本还是仅二进制文件?

4 个答案:

答案 0 :(得分:4)

没有混合,一切都是二进制,你只需要知道如何处理字节。只需读取字节并决定如何处理它们。

并且你可能需要超过两个字节来包含大小,因为你还必须知道你将要阅读的信息的发现。因此,您需要知道能够正确读取它的大小和类型。

你可能会得到类似的东西:

0      1        3                  (4 + length)
+------+--------+------------------------+
| Type | Length | Actual message content |
+------+--------+------------------------+

答案 1 :(得分:1)

当然,所有内容都以字节形式存储,当然您可以使用任何二进制阅读器来阅读它,但重要的是,使用数据是多么容易。

当您将文件I / O作为文本数据执行时,它会为您节省很多麻烦,不得不处理编码,特定于平台的标准(如换行符)以及其他涉及解释您正在读取的字节的事情。

当您以二进制模式阅读时,您实际上并没有为您处理任何这些便利。您可以阅读0x0A 0x0D并将其解释为单独的字节,但是谁会真正知道它们在没有上下文的情况下代表什么(换行+回车)

当我说一个文件包含“文本数据”或它是一个“文本文件”时,我通常意味着你可以用特定的编码来读它,因此一个“混合”文本和二进制的文件变得有点困难,因为如果你假设它是文本数据,你的程序可能会崩溃应该被视为二进制数据的字节(例如:一个整数的两个字节,而不是将它转换为你正在使用的任何编码的字符)

完全可以创建这样的文件,但是您必须以二进制模式执行文件I / O并保持一致(并希望任何输入的输入都可以转换为您决定使用的任何格式) 。虽然从评论中可以看出DataOutputStream使你更容易。

答案 2 :(得分:0)

文本用二进制数据表示,所以没有什么可以阻止你混合它们。例如,您可以将Java对象编写到文件中,Java对象包含文本。

你所谈论的那种差异实际上是可以放在输入/输出流周围的各种包装器,它们将文本行或二进制对象的结构放在输入或输出流上。

因此,如果在输出流周围使用二进制包装器,则可以将文本写为二进制数据。

必须在输入和输出流上创建自己的包装器,以便将二进制字节或数据流正确解释为二进制和文本数据。

我建议您使用一个类,它允许您创建包含文本数据的对象,并使用对象输入和对象输出包装器让Java运行时为您解决所有问题。

reading and writing serializable objects上查看这篇文章。

这是article about object streams

这是article on serializing object has pictures

答案 3 :(得分:0)

由于字符是'由'字节构成的,您可以使用二进制API(OutputStream)来执行这两种操作,编写基于二进制和基于文本的数据。例如:

try (OutputStream out = new FileOutputStream(file)) {
    out.write(recordSizeFirstByte);
    out.write(recordSizeSecondByte);
    out.write(stringData.getBytes("UTF-8"));
}

说明:首先写入两个字节,然后写入使用UTF-8编码的字符数据。