使用别的东西而不是String

时间:2015-04-01 10:44:10

标签: java string bytearray

我有一个大文件,我想对它做一些“操作”。(查找一些文本,检查是否存在某些文本,获取某些文本的偏移量,可能更改文件)。

我目前的方法是:

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的信息,这将是最好的选择

3 个答案:

答案 0 :(得分:0)

splitindexOf开启的最佳类型是String。只需使用它。

答案 1 :(得分:0)

您可以使用StringBufferStringBuilder。这两个类几乎像String类,具有可变性的优点。

此外,只要您需要String提供的某些功能,您就可以轻松将其转换为String。要转换它们,您只需使用toString()方法即可。

根据您的具体情况,您可以使用其他一些数据类型作为String的替代方案。但总的来说StringBufferStringBuilder是最好的选择,而不是字符串。使用StringBuffer进行同步,并在其他情况下使用StringBuilder

答案 2 :(得分:0)

最自然的选择是CharBuffer。与StringStringBuilder一样,它实现了CharSequence interface,因此它可以与许多面向文本的API一起使用,最值得注意的是regex engine大多数搜索,拆分和替换操作的后端。

CharBuffer自然选择的原因在于它也是charset package使用的类型,它提供了从字节转换字符到字节的必要操作。通过处理此API,您可以直接从CharBuffer进行转换,无需额外的数据复制步骤。

请注意,Java的正则表达式API已准备好处理包含部分读取文件的缓冲区,并可报告读取更多数据是否可能会更改结果(请参阅hitEnd()requireEnd())。

这些是构建应用程序的必要工具,这些应用程序可以处理较小块中的大型文件,而不会从中创建String实例(或仅在必要时,例如在提取匹配的子序列时)。