据我了解,Java中有两种类型的File I / O apis
文本导向和二元导向
我无法理解的是,当我们想要创建一个混合了文本和二进制数据的文件时,我们会使用什么
例如。将变量长度记录保存在文件中的简单情况,其中每个记录(unicode文本)具有2个字节(short
)的整数,用于指定记录的大小。
这可能吗?或者我只能操作单一类型的文件?仅文本还是仅二进制文件?
答案 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上查看这篇文章。
答案 3 :(得分:0)
由于字符是'由'字节构成的,您可以使用二进制API(OutputStream
)来执行这两种操作,编写基于二进制和基于文本的数据。例如:
try (OutputStream out = new FileOutputStream(file)) {
out.write(recordSizeFirstByte);
out.write(recordSizeSecondByte);
out.write(stringData.getBytes("UTF-8"));
}
说明:首先写入两个字节,然后写入使用UTF-8编码的字符数据。