Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在将字符串拆分为最大1Mb大小的子字符串时遇到问题_Java_String - Fatal编程技术网

Java 在将字符串拆分为最大1Mb大小的子字符串时遇到问题

Java 在将字符串拆分为最大1Mb大小的子字符串时遇到问题,java,string,Java,String,我必须将一个字符串拆分为1Mb大小的字符串。使用 UTF-8/COD>作为字符编码,一些字母占用1个字节以上,因此避免在中间分裂字符(例如‘胡’是2字节,所以不能1个字节到一个字符串的结尾,1个字节不能到下一个字符串) 它没有问题,我得到了3个字符串,因为3兆字节的字符串被分割成3,1兆字节的字符串。但是,如果我将createDataSize()方法的char更改为将'á'附加到示例字符串中,那么它只代表“áááá…”,cutString方法中的内部while循环将永远持续,因为它将逐个删除每个

我必须将一个字符串拆分为1Mb大小的字符串。使用<代码> UTF-8/COD>作为字符编码,一些字母占用1个字节以上,因此避免在中间分裂字符(例如‘胡’是2字节,所以不能1个字节到一个字符串的结尾,1个字节不能到下一个字符串)


它没有问题,我得到了3个字符串,因为3兆字节的字符串被分割成3,1兆字节的字符串。但是,如果我将
createDataSize()
方法的
char
更改为将
'á'
附加到示例字符串中,那么它只代表“áááá…”,
cutString
方法中的内部while循环将永远持续,因为它将逐个删除每个“á”,直到它适合给定的大小。我怎样才能改善内心世界,或者想出类似的解决方案?字符串可以小于1兆字节,但不能更大

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

简单地减少速度更快,只使用块大小的一半,如果你仍然有一些空间,添加一半,如果没有,删除一半。等等


一个更简单的解决方案是只删除
chunk.getBytes(encoding).length
chunkSize
之间的差异。然后看看如果你想完全填充它,你还可以使用多少字节。

你的问题有点奇怪-如果你知道你在使用UTF-8,为什么首先要使用
字符串?多次使用子字符串+编码是致命的(本质上是以幂为单位线性地遍历字符串),但是如果您从一开始就知道您使用的是UTF-8,那又有什么意义呢?你能详细说明一下你打算如何读取字符数据吗?
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");