走过路过不要错过,新鲜出炉的经验贴,能力一般,水平有限,欢迎各位大神批评指正。
经过一个多月基础班的学习,收获颇多,也踩过一些坑,以下对我遇到一些典型的坑做些总结:
一、字符串split()方法注意事项
概述:split()方法主要用来根据给定正则表达式的匹配拆分此字符串。
问题描述:给定一个字符串,如果要求求出该字符串中指定字符串个数,可使用此方法按照指定的字符串拆分成一个字符串数组,通过计算字符串数组的长度来求出指定字符串的个数;但是首先要判断指定的字符串在源字符串中的位置(开头或者结尾)
代码实现:
//已知字符串str,里面包含若干个字符串"heima",求出该字符串个数
String str = "heimasdfaodjheimasdfadheimasadfadfheima";
//根据"heima"字符串拆分str字符串
String[]array = str.split("heima");
//打印array字符串
System.out.println(Arrays.toString(array));
//计算array字符串的长度
System.out.println(array.length);
测试结果:
结果分析:已知字符串str中包含四个字符串“heima”,且str以该字符串开头和结尾,拆分出来的字符串数组如上,可以看出,当以“heima”开头时,拆分后,字符串0索引位置有一个空的字符串,但是以“heima”结尾时,最后一个索引处并不会有空的字符串。因此使用split()方法计算源字符串中指定字符串的个数时,需判断是否以指定的字符串结尾:如果已指定的字符串结尾,那么指定的字符串的个数即为拆分后的字符串数组的长度,否则指定的字符串的个数为拆分后的字符串数组的长度-1;
二、TCP协议写出数据注意事项
描述: 通过TCP协议实现模拟聊天功能时。客户端通过将字节输出流包装成高效字符输出流进行写出时,如果服务端也是通过高效字符输入流进行接收,此时,客户端写出时,没写出一行数据,就要进行换行,因为服务端接收数据时,是以换行符作为一行结束标识接收数据,并且写出数据后,需要通过flush()方法刷新,而不能通过关流进行刷新,如果在此处关流,就会结束Socket
示例代码(客户端):
public static void main(String[] args) throws Exception {
//创建键盘录入对象
Scanner SC = new Scanner(System.in);
//接收键盘录入数据
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//创建客户端Socket对象
Socket s = new Socket(InetAddress.getLocalHost(),6666);
//创建输出流对象
OutputStream os = s.getOutputStream();
//PrintWriterpw = new PrintWriter(os,true);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
//发送数据
//pw.println(username);
//pw.println(password);
bw.write(username);
bw.newLine();
//bw.flush();
bw.write(password);
bw.newLine();
bw.flush();
//bw.close();
示例代码(服务端):
public static void main(String[] args) throws Exception {
//创建服务端ServerSocket对象
ServerSocket ss = new ServerSocket(6666);
//创建Socket对象
Socket s = ss.accept();
//创建输入流对象
InputStreamis = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//接收数据
String username = br.readLine();
String password = br.readLine();
问题现象:
1.如果没有换行和刷新,客户端发送数据后,服务端并不会接收到
2.如果在示例代码(客户端)写出数据结束后,添加关流就会出现以下问题
解决措施如示例代码(客户端):添加newLine()换行和flush()刷新
三、通过标准输入流从控制台接收数据注意事项
描述:通过标准输入流从控制台接收数据时,代码及控制台结果如下
从以上控制台结果来看,实际输入一个字符串”sdafas”,但是输出该字符换后进行了换行,通过debug模式查看结果如下
从以上debug结果可以看出,实际录入的字符长度为5,但是接收到的字符长度为7,且字符串s=”sdfaf\r\n”,将录入时enter键记录进去,到时输出有换行效果,此效果会影响模拟用户登录验证是否登录成功结果,因为实际接收控制台录入的字符串会记录换行符;
通过字符转换流接收键盘录入数据也会遇到该问题:
修改方法:通过字符转换流,再通过缓冲输入流一次读取一行形式读取字符串,示例代码如下:
Debug结果如下