A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宏图伟业 初级黑马   /  2017-12-4 16:24  /  1235 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 宏图伟业 于 2017-12-4 16:33 编辑


JavaEE基础班经验分享

走过路过不要错过,新鲜出炉的经验贴,能力一般,水平有限,欢迎各位大神批评指正。

经过一个多月基础班的学习,收获颇多,也踩过一些坑,以下对我遇到一些典型的坑做些总结:

一、字符串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结果如下






1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马