编辑:请注意,由于硬盘实际写入数据的方式,此列表中的所有方案都无法可靠地工作。不要使用它们。只需使用数据库。 SQLite非常简单。
在磁盘上存储UTF-8字符串元组的最低技术但可靠的方法是什么?存储应该只附加可靠性。
作为文档存储系统的一部分,我正在尝试我必须将UTF-8元组数据存储在磁盘上。显然,对于完整的实现,我想使用像Amazon S3,Project Voldemort或CouchDB这样的东西。
然而,目前,我正在尝试,甚至还没有坚定地使用编程语言。我一直在使用CSV,但当你试图存储古怪的unicode和意外的空格(例如垂直制表符)时,CSV往往会变脆。
我可以使用XML或JSON进行存储,但它们对仅附加文件不起作用。到目前为止,我最好的猜测是一种相当特殊的格式,其中每个字符串前面都有一个4字节的有符号整数,表示它包含的字节数,整数值-1表示该元组已完成 - 相当于CSV换行符。令人头痛的主要原因是必须决定磁盘上整数的字节顺序。
编辑:实际上,这不起作用。如果程序在写入字符串时退出,则数据将不可逆转地不对齐。需要某种带外信令来确保在中止元组之后重新获得对齐。
编辑2:在附加到文本文件时可以保证原子性,但解析器非常重要。现在编写解析器。
编辑3:您可以在http://github.com/MetalBeetle/Fruitbat/tree/master/src/com/metalbeetle/fruitbat/atrio/查看最终结果。
答案 0 :(得分:2)
我建议使用制表符分隔每个字段和回车分隔每个记录。
在每个字符串中,替换将影响字段并记录解释和呈现的所有字符。这将包括控制字符(U + 0000-U + 001F,U + 007F-U + 009F),非图形行和段落分隔符(U + 2028,U = 2029),方向控制字符(U + 202A-U + 202E)和字节顺序标记(U + FEFF)。
它们应该用常量长度的转义序列替换。转义序列应以罕见(适用于您的应用程序)字符开头。转义字符本身也应该被转义。
这样可以轻松添加新记录。它还有一个额外的好处,就是能够将文件加载到任何电子表格或文字处理程序中进行目视检查和修改,这对于调试来说非常有用。
这也很容易编码,因为该文件将是有效的UTF-8文档,因此可以使用标准的文本读写例程。如果需要,这也允许您轻松转换为UTF-16BE或UTF-16LE,无任何复杂情况。
示例:
U+0009 CHARACTER TABULATION becomes ~TB
U+000A LINE FEED becomes ~LF
U+000D CARRIAGE RETURN becomes ~CR
U+007E TILDE becomes ~~~
etc.
有几个原因可以让制表符作为字段分隔符比逗号更好。逗号更常见于普通文本字符串(例如英文文本)中,并且必须更频繁地替换。电子表格程序(如Microsoft Excel)倾向于更自然地处理制表符分隔文件。
答案 1 :(得分:1)
在这里大声思考......
技术真的很低就是使用(例如)空字节作为分隔符,只是“引用”输出中出现的所有空字节,并附加一个空值。
也许有人可以使用SCSU。
或者看看gzip格式可能是值得的,如果不使用它可能是猿类:
gzip文件由一系列“成员”(压缩数据集)组成。
[...]
成员只是在文件中一个接一个地出现,在它们之前,之间或之后没有其他信息。
这些成员中的每一个都可以有一个可选的“文件名”,评论等,我相信你可以继续追加成员。
或者您可以使用torrent文件中使用的bencode。或BSON。
另见Wikipedia's Comparison of data serialization formats。
否则我认为你在每个字符串前面加上长度的想法可能是最简单的。