我正在构建历史解析器,有一个应用程序已经完成了日志记录任务(基于文本)。 现在我的主管要我创建一个应用程序来读取该日志。 日志是在月末创建的,由[date]:
分隔 [19-11-2014]
- 这里有什么内容
- 这里有什么
[20-11-2014]
- 这里有什么内容
- 这里有什么
等...
如果日志文件的大小很小,则DataInputStream处理内容以获取byte []并将其转换为String然后执行过滤过程(通过执行子字符串等)没有问题。
但是当文件大小(大约100mb)时,它会抛出JavaHeapSpace异常。我知道这是因为内容的长度超过String maxlength,当我尝试不将byte []转换为字符串时,没有抛出异常。
现在的问题是,如何将byte []拆分成几个字节[]? 每个新字节[]只包含单个:
[日期]
- 这里有什么
因此,如果在一个月内我们在日志中有9个日期,它将被分成9个字节[]。 分裂标记将基于[\\ d {2} - \\ d {2} - \\ d {4}],如果是字符串我可以使用正则表达式查找所有标记,获取indexOf然后子串。
但是如何在不先转换为字符串的情况下执行此操作?因为它会抛出JavaHeapSpace。
答案 0 :(得分:0)
我认为这里有几个概念你不会错过。
首先,InputStream
是一个Stream,这意味着它是一个字节流。您对该流程的处理取决于您,但将所有流保存到内存完全违反了流构造的要点。
其次,DataInputStream
用于读取由DataOutputStream
序列化的二进制文件中的对象。只读一个字符串对于这种类型的流来说是过度的,因为简单的InputStream
可以做到这一点。
至于你的具体问题,我会使用BufferedFileReader,一次读一行,直到到达下一个日期。此时,您可以在读取的最后一行行上执行所需的任何处理,并释放内存。因此没有遇到同样的问题。