使用其他东西而不是 String

Using something else instead of String

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

我目前的做法是这样的:

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 更改为其他内容。考虑到我希望能够获得有关该数据内容的一些信息,我可能会在 String

上调用 IndexOf 获得的信息,最好的选择是什么

splitindexOf 的最佳类型是 String。随便用。

您可以使用 StringBufferStringBuilder 。这两个 class 几乎像 String class 一样具有可变性的优势。

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

您可以根据自己的情况使用其他数据类型替代 String。但一般来说 StringBufferStringBuilder 是替代字符串的最佳选择。使用 StringBuffer 进行同步,在其他情况下使用 StringBuilder

最自然的选择是 CharBuffer. Like String and StringBuilder it implements the CharSequence interface, therefore it can be used with a lot of text oriented APIs, most notably the regex engine,它是大多数搜索、拆分和替换操作的后端。

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

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

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