java 字符串 解析_java语法:java_解析字符串

请求:

分:各种信息key=value

合:拼成1个字符串

分:拆分成各种信息

合:类(hashmap、list、自定义类)、数组、字符串

分:获取容器类的单个信息处理

响应:

分:各种响应信息

合:类、hashmap等

分:单个取出来处理

合:合成字符串,返回

一、请求和接收双方,达成一个协议

二、请求方,按照协议格式,把所有信息拼成1个字符串

1. 请求行格式:

请求方法 请求路径 协议版本

2. 其中请求路径格式

协议类型://IP地址:端口号/工程名/资源路径?参数名=参数值&参数名=参数值

3. 实例

get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1

三、接收方,按照协议格式,把字符串拆分成零散的信息

string常用方法

split("分隔符号");

indexOf("定位符号");

substring(开始下标,结束下标);

equals("要比较的串");

equalsIgnoreCase("要比较的串")

字符串切分完的小块,单个存放,打包存放

基本变量(单个,key=value,缺点,很多个的时候,传输特别麻烦)

字符串

数组(value,固定,缺点,多了记不住哪个位置是什么东西)

list(value,不固定,缺点,多了记不住哪个位置是什么东西)

hashmap(key=value,不固定,缺点背不住名字)

类(key=value,固定,有点很明显,缺点,属性是预先固定)

package com.guoyasoft.tomcat;

import java.util.HashMap;

import java.util.Map;

public class Request {

private String method;

private String url;

private String protocalVersion;

private String protocal;

private String ip;

private String port;

private String projectName;

private String resourcePath;

private Mapparameters=new HashMap();

public MapgetParameters() {

return parameters;

}

public void setParameter(Mapparameter) {

this.parameters = parameters;

}

public String getParameter(String key){

return parameters.get(key);

}

public String getMethod() {

return method;

}

public void setMethod(String method) {

this.method = method;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getProtocalVersion() {

return protocalVersion;

}

public void setProtocalVersion(String protocalVersion) {

this.protocalVersion = protocalVersion;

}

public String getProtocal() {

return protocal;

}

public void setProtocal(String protocal) {

this.protocal = protocal;

}

public String getIp() {

return ip;

}

public void setIp(String ip) {

this.ip = ip;

}

public String getPort() {

return port;

}

public void setPort(String port) {

this.port = port;

}

public String getProjectName() {

return projectName;

}

public void setProjectName(String projectName) {

this.projectName = projectName;

}

public String getResourcePath() {

return resourcePath;

}

public void setResourcePath(String resourcePath) {

this.resourcePath = resourcePath;

}

public void setParameters(Mapparameters) {

this.parameters = parameters;

}

}

package com.guoyasoft;

import java.util.HashMap;

import java.util.Map;

import org.testng.annotations.Test;

import com.guoyasoft.tomcat.Request;

public class StringTools {

@Test

public Request testString(String str){

/*

* 第1部分:请求行

* 1. 请求方法

* 2. 请求资源路径

* 3. 协议版本

*/

Request request=new Request();

// String str="get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1";

//切割:把一个大的字符串,按照分割符,切割成很多小的字符串

String[] firstLine=str.split(" ");

String method=firstLine[0];

System.out.println("请求方法:"+method);

request.setMethod(method);

String url=firstLine[1];

System.out.println("资源路径:"+url);

request.setUrl(url);

String protocalVersion=firstLine[2];

System.out.println("协议版本:"+protocalVersion);

request.setProtocalVersion(protocalVersion);

/*

* 资源路径

* 1. 协议:http或者https

* 2. ip:"//"开始,":"结束

* 3. 端口:":"开始,"/"第一个反斜杠结束

* 4. 工程名:第一个"/"开始,第二个反斜杠结束

* 5. 资源路径:第二个"/"开始,"?"结束,如果没有"?",直接到结尾

* 6. 参数:"?"开始,一直到结束

*/

int httpIndex=url.indexOf("://");

String protocal=url.substring(0,httpIndex);

System.out.println("协议:"+protocal);

request.setProtocal(protocal);

url=url.substring(httpIndex+3);

System.out.println(url);

int ipIndex=url.indexOf(":");

String ip=url.substring(0,ipIndex);

System.out.println("ip:"+ip);

request.setIp(ip);

url=url.substring(ipIndex+1);

System.out.println(url);

int portIndex=url.indexOf("/");

String port=url.substring(0,portIndex);

System.out.println("端口号:"+port);

request.setPort(port);

url=url.substring(portIndex+1);

System.out.println(url);

int prjIndex=url.indexOf("/");

String prj=url.substring(0,prjIndex);

System.out.println("工程名:"+prj);

request.setProjectName(prj);

url=url.substring(prjIndex+1);

int resIndex=url.indexOf("?");

String res=url.substring(0,resIndex);

System.out.println("资源路径:"+res);

request.setResourcePath(res);

url=url.substring(resIndex+1);

Mapparameters=new HashMap();

String[] ps=url.split("&");

for(String s:ps){

System.out.println(s.split("=")[0]+"="+s.split("=")[1]);

parameters.put(s.split("=")[0], s.split("=")[1]);

}

request.setParameters(parameters);

return request;

}

}

测试类:

package com.guoyasoft.client;

import com.guoyasoft.StringTools;

public class TestString {

public static void main(String[] args) {

String url = "get http://127.0.0.1:8080/NewWeb/login?name=guoyasoft&password=123456 HTTP1.1";

StringTools.testString(url);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,如果字符串很长,直接将其转换为字节数组可能会导致内存溢出。在这种情况下,可以采用分段处理的方式,将字符串分为若干个较小的片段进行编码和解码。具体实现可以按照以下步骤进行: 1. 将字符串分为若干个固定长度的片段,每个片段的长度为N。 2. 对于每个片段,将其转换为字节数组,然后将字节数组转换为long类型进行编码。 3. 将所有编码后的long值拼接起来,得到最终的编码结果。 4. 解码时,按照相同的方式将编码结果拆分为若干个编码后的long值。 5. 对于每个编码后的long值,解码为字节数组,然后将字节数组转换为字符串。 6. 将所有解码后的字符串拼接起来,得到最终的解码结果。 下面是一个示例代码: ```java public class Codec { private static final int CHUNK_SIZE = 1024; // 每个片段的长度为1024字节 public long encode(long msg) { return msg * 2; // 这里只是一个示例编码方式,可以根据需求修改 } public long decode(long msg) { return msg / 2; // 对应的解码方式 } public long[] encodeString(String str) { byte[] bytes = str.getBytes(); int numChunks = (int) Math.ceil((double) bytes.length / CHUNK_SIZE); long[] result = new long[numChunks]; for (int i = 0; i < numChunks; i++) { int start = i * CHUNK_SIZE; int end = Math.min((i + 1) * CHUNK_SIZE, bytes.length); byte[] chunk = Arrays.copyOfRange(bytes, start, end); long encoded = 0; for (int j = 0; j < chunk.length; j++) { encoded += ((long) chunk[j]) << (8 * j); } result[i] = encode(encoded); } return result; } public String decodeString(long[] msg) { byte[] bytes = new byte[msg.length * CHUNK_SIZE]; for (int i = 0; i < msg.length; i++) { long decoded = decode(msg[i]); for (int j = 0; j < CHUNK_SIZE; j++) { bytes[i * CHUNK_SIZE + j] = (byte) ((decoded >> (8 * j)) & 0xff); } } return new String(bytes); } } ``` 上述代码,encodeString方法将字符串分为若干个长度为1024字节的片段,对于每个片段,将其转换为字节数组,然后将字节数组转换为long类型进行编码,最终得到一个long数组。decodeString方法则是对应的解码方法,将编码结果拆分为若干个编码后的long值,对于每个编码后的long值,解码为字节数组,然后将字节数组转换为字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值