java 按字节截取字符串问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 按字节截取字符串问题相关的知识,希望对你有一定的参考价值。

我要解析一个很长的字符串 按照字节长度截取 ,例如bSubString(String msg,int begin,int end), 返回我要截取的那段 这个字符串我要截取很多次 包括空格 我要得到bsubstring(msg,1,9) bsubstring(msg,10,29)这样的 求高手帮忙 最好测试了再回答 回答的号还加分 比较急
一个字符串 字节的长度和位置指定了,包括汉字,我要解析这个字符串 把整个字符串截取成小字符串,我就要调用bsubstring(str,50,400)这样的 按照字节 问题描述比较清楚吧 我这字符串就几千个字节 不考虑运行速度啊 内存那些问题

public class FormatTool
/**
*
*
* @param
* @return String
* @param formatStr
* 被格式化字符串
* @param tag
* 不足位补充字符串
* @param len
* 字符串长度
* @param direction
* 1:左补,0:右补
* @return desc
*/
public static String format(Object formatStr, String tag, int len,
int direction)
String str = formatStr.toString();
if (len <= str.length())
return str.substring(0, len);

StringBuilder tempStr = new StringBuilder();
for (int i = 0; i < len - str.getBytes().length; i++)
tempStr.append(tag);

if (direction == 0)
return str + tempStr;
else
return tempStr.append(formatStr).toString();



/**
* 字节数组拷贝
*
* @param
* @return void
* @param fromBytes
* @param toBytes
* @param from
* @param len
* desc
*/
public static void cpyBytes(byte[] fromBytes, byte[] toBytes, int from,
int len)
for (int i = from; i < from + len; i++)
toBytes[i - from] = fromBytes[i];



/**
* 获取字符串formatStr从from到from + len的字符串
*
* @param
* @return String
* @param formatStr
* @param from
* @param len
* @return
* desc
*/
public static String format(String formatStr, int from, int len)
byte[] fromBytes = formatStr.getBytes();
byte[] toBytes = new byte[len];
cpyBytes(fromBytes, toBytes, from, len);
return new String(toBytes);


使用方法FormatTool.format(str,50,400);表示的意思就是截取str字符串从第50个字节开始截取,截取400个字节的字符串
参考技术A 关于你的问题的问题:1. 到底按字节截还是字符截?按字节的话必须先将字符串转为byte array 2.很长是多长,多次是多少次?现在计算机的内存及计算能力你不要低估了,在一个普通的笔记本上,对于10M长的字符串,进行1百万次随机位置的substring,不到1秒。3.如果真是很长很多次,那你要对你substring的顺利研究下,看能不能尽量挨着访问,从内存访问(缺页)方面来提高一点速度,不过这需求确实确实好难见。
试试下面程序的运行速度吧:
import java.util.*;

public class Study
public static void main(String[] args)
StringBuilder sb = new StringBuilder();
System.out.println(System.currentTimeMillis());
for(int i = 0; i < 1000000; i++)
sb.append("1234567890");

System.out.println(System.currentTimeMillis());
String str = sb.toString();
Random rand = new Random();
for(int i = 0; i < 1000000; i++)
int beg = rand.nextInt(5000000);
int end = rand.nextInt(5000000)+beg;
str.substring(beg, end);

System.out.println(System.currentTimeMillis());

参考技术B 我给你思路
你可以参考replace方法得到 网上很多自写的replace 你定位地址可以用indexof方法
参考技术C static String bSubString(String msg, int begin, int end)
return msg.substring(begin, begin + end);

java按照字节切割字符串,解决汉字的问题

编写一个截取字符串的函数,输入为一个字符串,截取开始地址,截取字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,

如“我ABC”,0,4,应该截为“我AB”,输入“我ABC汉DEF”,1,4,应该输出为“ABC”而不是“ABC+汉的半个”。

import java.io.UnsupportedEncodingException;

public class SubStr {

public static String bSubString(String str,int be,int length) throws UnsupportedEncodingException{

byte[] bytes;

bytes=str.getBytes("Unicode");

int z=be=2*be+2;

int n=0,count=0;

for(;be<bytes.length&&n<length;n++,be++){

if(bytes[be]==0){

n--;

}

count++;

}

System.out.println(be+" "+count+" "+n);

if(count%2==1){

if(bytes[count-1]!=0){

count--;

}else if(bytes[count-1]==0){

count++;

}

}

return new String(bytes,z,count,"Unicode");

 

}

public static void main(String[] args) {

String str="中国abc";

try {

System.out.println(bSubString(str,0,5));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

以上是关于java 按字节截取字符串问题的主要内容,如果未能解决你的问题,请参考以下文章

java,要实现字符串按字节截取的方法

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

java字符串按字节补空问题

用java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保

【急求】java 按字节截取字符串,从指定的位置开始,到指定的位置结束

java按给定字节数截取含有中英文的字符串