按字节(字符)拆分字节数组

时间:2014-11-21 14:53:44

标签: java

我正在构建历史解析器,有一个应用程序已经完成了日志记录任务(基于文本)。 现在我的主管要我创建一个应用程序来读取该日志。 日志是在月末创建的,由[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。

1 个答案:

答案 0 :(得分:0)

我认为这里有几个概念你不会错过。

首先,InputStream是一个Stream,这意味着它是一个字节流。您对该流程的处理取决于您,但将所有流保存到内存完全违反了流构造的要点。

其次,DataInputStream用于读取由DataOutputStream序列化的二进制文件中的对象。只读一个字符串对于这种类型的流来说是过度的,因为简单的InputStream可以做到这一点。

至于你的具体问题,我会使用BufferedFileReader,一次读一行,直到到达下一个日期。此时,您可以在读取的最后一行行上执行所需的任何处理,并释放内存。因此没有遇到同样的问题。