假设我们有一行10 GB的文件,我们需要对它进行一些操作(它可能只是随机字母,arggzdfnbnipntrs)。
作为一个例子,我们可能会被要求检查这条线是否是回文,但我们无法将其完全加载到内存中。我们需要加载第一个字符并将其与最后一个字符进行比较,依此类推。这是如何在Java中完成的? (包括UTF-8支持)
答案 0 :(得分:2)
UTF-8是一种可变长度编码,每个字符为1到6个字节。您不能简单地将文件的第一个字节与最后一个字节进行比较。根据第一个字符的编码长度,您可能需要将第一个字节与第六个到最后一个字节进行比较。
您可以使用RandomAccessFile
或FileChannel
获得相对高效的随机文件访问权限,但API(或基础文件系统)并非设计用于“向后”阅读。要向后阅读,每个read()
必须以seek()
开头。
在某种程度上,从文件系统读取整个块并将其保存在存储器中,从而最小化实际寻找和读取物理硬盘驱动器头。尽管如此,从Java到操作系统的数十亿次调用所涉及的开销仍在堆叠,因此维护自己的缓冲区可能是值得的。仅当缓冲区为空时才执行搜索和批量读取。
幸运的是,您的老师也没有要求提供Unicode支持!