我必须将字符串拆分为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).length
和chunkSize
之间的差异。然后查看如果要完全填充它仍然可以使用多少个字节。