将字符串分成最大1MB大小子字符串时遇到问题



我必须将字符串拆分为1MB大小字符串。当使用UTF-8作为字符编码时,一些字母占1个字节以上,因此避免在中间分开字符(例如'Á'是2个字节,所以1个字节不能转到一个字符串的末尾,1到下一个字符串的开始(

public static List<String> cutString3(String original, int chunkSize, String encoding) throws UnsupportedEncodingException {
    List<String> strings = new ArrayList<>();
    final int end = original.length();
    int from = 0;
    int to = 0;
    do {
        to = (to + chunkSize > end) ? end : to + chunkSize;
        String chunk = original.substring(from, to); // get chunk
        while (chunk.getBytes(encoding).length > chunkSize) { // cut the chunk from the end
            chunk = original.substring(from, --to);
        }
        strings.add(chunk); // add chunk to collection
        from = to; // next chunk
    } while (to < end);
    return strings;
}

我正在使用上述方法生成示例字符串:

private static String createDataSize(int msgSize) {
    StringBuilder sb = new StringBuilder(msgSize);
    for (int i = 0; i < msgSize; i++) {
        sb.append("a");
    }
    return sb.toString();
}

将该方法称为以下内容:

String exampleString = createDataSize(1024*1024*3);
cutString(exampleString, 1024*1024, "UTF-8");

它没有问题,我会拿回3个字符串,因为将3兆字符串拆分为3个兆字节。但是,如果我将createDataSize()方法的char更改为示例字符串附加'á',所以它仅来自"áááááá" ...在cutString方法中循环时,内心是永远的,因为它正在删除每个'á',直到一个删除,直到它适合给定的大小。我如何在同时改善内部,或提出类似的解决方案?字符串可能小于1兆字节,只是不大!

使用二进制搜索逻辑显然适合您的需求。

仅使用块尺寸的一半减小,如果您仍然像某个房间一样,请添加一半(如果不是的话(,将其删除和一半。等等。

一个简单的解决方案是仅删除chunk.getBytes(encoding).lengthchunkSize之间的差异。然后查看如果要完全填充它仍然可以使用多少个字节。

相关内容

最新更新