Joe*_*oey 13 java nio text-files
我正在写一些需要处理非常大的文本文件的东西(至少有几个GiB).这里需要什么(这是固定的)是:
该文件的大小不许在存储器完全保持它(这也是不希望的,附加的变化时,应尽快持续自).
我曾想过使用内存映射区域作为文件的窗口,如果请求超出其范围的行,它将被移动.当然,在那个阶段我仍然没有字节级别以上的抽象.为了实际使用内容我CharsetDecoder给了我一个CharBuffer.现在的问题是,我可以处理文本行可能就好了CharBuffer,但我还需要知道文件中该行的字节偏移量(以保持行索引和偏移的缓存,所以我不必再次从头开始扫描文件以查找特定行.
有没有办法CharBuffer将匹配ByteBuffer中的偏移量映射到匹配中?使用ASCII或ISO-8859-*显然是微不足道的,对于UTF-8和ISO 2022或BOCU-1来说,事情会变得非常丑陋(不是我实际上期望后两种,但UTF-8应该是默认值) - 并且仍然存在问题).
我想我可以CharBuffer再次将一部分转换为字节并使用长度.无论是工作还是我遇到了变音符号的问题,在这种情况下我可能会强制要求使用NFC或NFD以确保文本始终是明确编码的.
不过,我想知道这是不是要走到这里的方式.有更好的选择吗?
ETA:有人回答常见问题和建议:
这是用于模拟运行的数据存储,旨在成为完整数据库的小型本地替代方案.我们也有数据库后端并且它们被使用,但是对于它们不可用或不适用的情况,我们确实需要这样做.
我也只支持CSV的一个子集(没有嵌入式换行符),但现在还可以.这里有问题的几点是我无法预测线条的长度,因此需要创建文件的粗略地图.
至于什么我上面概述:我在思考的问题是,我可以很容易地确定对人物等级一行的末尾(U + 000D + U + 000A),但我不想假设这看起来像0A 0D上字节级别(对于UTF-16已经失败,例如,它或者是0D 00 0A 00或者00 0D 00 0A).我的想法是,我可以通过不对当前使用的编码细节进行硬编码来使字符编码变得可变.但我想我可以坚持使用UTF-8并将其他所有东西都加入其中.但不知何故,感觉不对劲.
在 Java 字符序列(实际上是 UTF-16)和字节之间维护 1:1 映射非常困难,字节可以是任何内容,具体取决于文件编码。即使使用 UTF-8,1 个字节到 1 个字符的“明显”映射也仅适用于 ASCII。UTF-16 和 UTF-8 都不能保证 unicode 字符可以存储在单台机器char或byte.
我会将文件窗口维护为字节缓冲区,而不是字符缓冲区。然后,为了在字节缓冲区中查找行结尾,我将使用与文件所在的编码相同的编码将Java 字符串"\r\n"(或可能只是)编码为字节序列。然后,我将使用该字节序列在中搜索行结尾"\n"字节缓冲区。缓冲区中结束的行的位置 + 缓冲区距文件开头的偏移量精确映射到文件中行结束的字节位置。
追加行只是查找文件末尾并添加新行的情况。改变线路更加棘手。我想我会维护更改行的字节位置以及更改内容的列表或映射。准备好写入更改时:
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |