Java 比较二进制数据或按行字符串哪个更快?

Java 比较二进制数据或按行字符串哪个更快?,java,string,performance,binary-data,string-matching,Java,String,Performance,Binary Data,String Matching,问题 我在这里描述我的问题的一个非常简化的版本。我有一个巨大的文件(10-50GB),我需要把它分成数百万个块。假设我有一些包含字符串“SPLITTER”的行。我需要把文件分成几行。每个区块将包含两条分割线之间的文本 这当然非常简单,实际用例将涉及更复杂的匹配/拆分 问题 所以我们这里有一个流匹配问题。哪一个更有效:将其视为字符串匹配问题,使用缓冲读取器读取行,并根据需要进行比较和拆分?-或者-将文件视为二进制输入流,将拆分器字符串视为数组[Byte],并进行字节比较 在我开始实施某些东西之前,

问题

我在这里描述我的问题的一个非常简化的版本。我有一个巨大的文件(10-50GB),我需要把它分成数百万个块。假设我有一些包含字符串“SPLITTER”的行。我需要把文件分成几行。每个区块将包含两条分割线之间的文本

这当然非常简单,实际用例将涉及更复杂的匹配/拆分

问题

所以我们这里有一个流匹配问题。哪一个更有效:将其视为字符串匹配问题,使用缓冲读取器读取行,并根据需要进行比较和拆分?-或者-将文件视为二进制输入流,将拆分器字符串视为数组[Byte],并进行字节比较

在我开始实施某些东西之前,我需要了解一些情况


我正在使用Java。此外,原始输入将动态地从bz2解压,这是值得的。

将数据作为原始字节处理总是会更快。以字符串形式获取数据意味着以字节形式读取数据,然后创建新字符串。

您甚至可以将文件视为一组字符串吗?任意二进制数据通常不会使字符串有效,尽管我不知道Java是否强制执行该命令。@delnan这是我的观点。从技术上讲,将文件视为一组字符串意味着类似于new BufferedReader(new InputStreamReader(someBinaryInputStream))——并使用此读取器执行匹配的拆分操作。这不需要额外的开销吗?由于文件有几十GB,而我匹配的字符串可能只有几十个字符,因此将它们转换为字节并直接进行字节匹配应该会更快?但这不是我的重点。当您有一堆
字节时,将它们解释为
String
(或
char[]
)通常是不正确的。根据您的操作方式,您可能会损坏二进制数据、丢失拆分行、生成无效字符串,并导致谁知道字符串处理中出现了什么错误,或者其他一些无意义的事情。无论你的“分割线”之间是什么,如果它真的是二进制数据,你无论如何也不能用它生成字符串,所以这个问题没有意义。我现在明白你的意思了,我同意。但我必须提到,我的特定用例实际上处理字符串数据。我只是在用Java解压压缩的bz2并将其作为二进制流。在基于
拆分器拆分的流中,这些字符串仍然是bz2二进制数据,还是已经解压?在前一种情况下(分割bz2流),没有任何变化:中间的数据现在是二进制的,即使它以后被转换成正确的字符串。