JAVA中:中英文混合的字符串按字节截取问题

现有一个很长中的英文混合的字符串(假如个数有两千万),怎么高效率的取左边10000个或者50000个字节的字符串?

如果一个一个取出再算长度实在太慢了。

我的QQ是 272867141 昵称是:浪迹天涯
String str="a中c国d人w";
str.subString(0,3);这个方法是按个数截取的,不是按字节截取的。

可以写个小的算法,每次取这个范围内的字符判断,然后再取一半根据大小判断.
比如:10000个可以先用substring截7500个字符(最少5000,最多10000,取一半),然后根据字节数大小,再按一半的方式进行截(如果比10000字节少,就取5000-7500中间的 ,如果多,就取7500-10000),依次类推就可以了,直到取得结果.

这样应该是次数最少的了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-10
楼上的同志们说的都有道理,你可以不这样处理字符串,可以把字符串变成一个个的字符数组来处理。String自带toCharArray()方法,可以自行转换,这样处理起来可以得心应手。
其实在做Java编程的时候,不要啃住一个骨头不放,方法是灵活的,思路更是灵活的,实际情况也是多变的。就像你说的一个长达几万字符的截取,就不会再用String去做了,这样不仅没有效率,而且你会发现程序冗长无力。实际上,没有人会去做截取这么长的字符串工作。

多多看高人写的程序,提高会很快的~
祝你成功~
第2个回答  2009-10-12
字符编码不同,一个汉字的字节数可能会有不同,所以实现这个程序困难不小。

比如,UTF8 and UTF16编码的字符字节数不是相同的。

实在看不出楼主的用意,假如你取到的第10000个字节刚好是中文字符编码的低位,转变成中文不就乱码了?又或是三字节的,你刚好取到两字节,这又会是乱码。

算了,我也不F话了,直接上java.nio.ByteBuffer+java.nio.channels.Channel来处理吧。
这个超快,不会找DOC。

附:
如果你愿意快速处理字符串,建议用StringBuffer来处理,在处理超大字符串时,程序会有意想不到的速度提升。 过百万字节的字符串如过用String.substring()来处理是超慢的。呵呵
第3个回答  2009-10-10
字符串有截取方法呀。。。。。
字符长度受你内存大小的影响~~~
String str="abc...";这样定义的字符串是存在字符串池中的
String str=new String("abc...")这样定义的字符串是在堆内存中的,然后 被栈内存的对象str引用
所以字符串是对象,是在内存中存储的,不像基本数据类型有各自的长度,字符串应该是只要是内存不满,是没有长度限制的
substring方法
String a="awdadadada342342424242424242424242";
String first10000=a.substring(0,9999);
String end10000=a.substring(a.length-9999);
希望能帮到你!!
第4个回答  2009-10-10
public class Tools {
public Tools() {
}
/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str, int len) {
return splitString(str, len, "...");
}

/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @param elide 省略符
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str,int len,String elide) {
if (str == null) {
return "";
}
byte[] strByte = str.getBytes();
int strLen = strByte.length;
int elideLen = (elide.trim().length() == 0) ? 0 : elide.getBytes().length;
if (len >= strLen || len < 1) {
return str;
}
if (len - elideLen > 0) {
len = len - elideLen;
}
int count = 0;
for (int i = 0; i < len; i++) {
int value = (int) strByte[i];
if (value < 0) {
count++;
}
}
if (count % 2 != 0) {
len = (len == 1) ? len + 1 : len - 1;
}
return new String(strByte, 0, len) + elide.trim();
}
}
相似回答