我有一个大文件,我想对它做一些“操作”。(查找一些文本,检查是否存在某些文本,获取某些文本的偏移量,可能更改文件)。
我目前的方法是:
public ResultSet getResultSet(String fileName) throws IOException {
InputStream in = new FileInputStream(fileName);
byte[] buffer = new byte[CAPACITY];
byte[] doubleBuffer = new byte[2 * CAPACITY];
long len = in.read(doubleBuffer);
while (true) {
String reconstitutedString = new String(doubleBuffer, 0 ,doubleBuffer.length);
//...do stuff
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(doubleBuffer, CAPACITY, CAPACITY);
readUntilNow += len;
len = in.read(buffer);
if (len <= 0) {
break;
}
os.write(buffer, 0, CAPACITY);
doubleBuffer = os.toByteArray();
os.close();
}
in.close();
return makeResult();
}
我想将 String reconstitutedString 更改为其他内容。考虑到我希望能够获得有关该数据内容的一些信息,我可能会在字符串上调用IndexOf的信息,这将是最好的选择
答案 0 :(得分:0)
要split
或indexOf
开启的最佳类型是String
。只需使用它。
答案 1 :(得分:0)
您可以使用StringBuffer
或StringBuilder
。这两个类几乎像String
类,具有可变性的优点。
此外,只要您需要String
提供的某些功能,您就可以轻松将其转换为String
。要转换它们,您只需使用toString()
方法即可。
根据您的具体情况,您可以使用其他一些数据类型作为String
的替代方案。但总的来说StringBuffer
和StringBuilder
是最好的选择,而不是字符串。使用StringBuffer
进行同步,并在其他情况下使用StringBuilder
。
答案 2 :(得分:0)
最自然的选择是CharBuffer
。与String
和StringBuilder
一样,它实现了CharSequence
interface
,因此它可以与许多面向文本的API一起使用,最值得注意的是regex engine大多数搜索,拆分和替换操作的后端。
CharBuffer
自然选择的原因在于它也是charset package使用的类型,它提供了从字节转换字符到字节的必要操作。通过处理此API,您可以直接从CharBuffer
进行转换,无需额外的数据复制步骤。
请注意,Java的正则表达式API已准备好处理包含部分读取文件的缓冲区,并可报告读取更多数据是否可能会更改结果(请参阅hitEnd()
和requireEnd()
)。
这些是构建应用程序的必要工具,这些应用程序可以处理较小块中的大型文件,而不会从中创建String
实例(或仅在必要时,例如在提取匹配的子序列时)。