JAVA中:中英文混合的字符串按字节截取问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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),依次类推就可以了,直到取得结果.
这样应该是次数最少的了 参考技术A 楼上的同志们说的都有道理,你可以不这样处理字符串,可以把字符串变成一个个的字符数组来处理。String自带toCharArray()方法,可以自行转换,这样处理起来可以得心应手。
其实在做Java编程的时候,不要啃住一个骨头不放,方法是灵活的,思路更是灵活的,实际情况也是多变的。就像你说的一个长达几万字符的截取,就不会再用String去做了,这样不仅没有效率,而且你会发现程序冗长无力。实际上,没有人会去做截取这么长的字符串工作。
多多看高人写的程序,提高会很快的~
祝你成功~ 参考技术B 字符编码不同,一个汉字的字节数可能会有不同,所以实现这个程序困难不小。
比如,UTF8 and UTF16编码的字符字节数不是相同的。
实在看不出楼主的用意,假如你取到的第10000个字节刚好是中文字符编码的低位,转变成中文不就乱码了?又或是三字节的,你刚好取到两字节,这又会是乱码。
算了,我也不F话了,直接上java.nio.ByteBuffer+java.nio.channels.Channel来处理吧。
这个超快,不会找DOC。
附:
如果你愿意快速处理字符串,建议用StringBuffer来处理,在处理超大字符串时,程序会有意想不到的速度提升。 过百万字节的字符串如过用String.substring()来处理是超慢的。呵呵 参考技术C 字符串有截取方法呀。。。。。
字符长度受你内存大小的影响~~~
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);
希望能帮到你!! 参考技术D 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();
Java 按字节计算字符串的长度
在《从后向前截取指定长度的字符串》中介绍了如何截取字符串,本文介绍如何统计字符串的字节长度。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; public class GetLength { private static final Logger logger = LoggerFactory.getLogger(GetLength.class); // 编码方式 private static final String ENCODE_UTF = "UTF-8"; /** * 计算中英文字符串的字节长度 <br/> * 一个中文占3个字节 * * @param str * @return int 字符串的字节长度 */ public static int getLength(String str) { if (str == null || str.length() == 0) { return 0; } try { return str.getBytes(ENCODE_UTF).length; } catch (UnsupportedEncodingException e) { logger.error("计算中英文字符串的字节长度失败,", e); } return 0; } /** * 计算中英文字符串的字节长度 * * @param str * @return int */ public static int getStrLength(String str) { if (str == null || str.length() == 0) { return 0; } int len = 0; for (int i = 0, j = str.length(); i < j; i++) { //UTF-8编码格式中文占三个字节,GBK编码格式 中文占两个字节 ; len += (str.charAt(i) > 255 ? 3 : 1); } return len; } public static void main(String[] args) { String str = "农业银行 3Wiener,支付密"; System.out.println(getLength(str)); System.out.println(getStrLength(str)); } }
以上是关于JAVA中:中英文混合的字符串按字节截取问题的主要内容,如果未能解决你的问题,请参考以下文章
用java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保