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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴乾刚 中级黑马   /  2013-3-6 16:19  /  1683 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴乾刚 于 2013-3-15 16:12 编辑

[/code]从键盘录入数据发送出去,当不输入数据直接在dos界面按Enter键时,readLine()方法读取到的不是null吗?为什么不会结束while循环

[code]public static void main(String[] args) throws Exception
        {
                DatagramSocket ds = new DatagramSocket();
               
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                while ((line=bufr.readLine())!=null)
                {
                        if("886".equals(line))
                                break;
                        
                        byte[] buf = line.getBytes();
                        DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("B2G6ACE50ZNYLME"),10001);

                        ds.send(dp);
                }
                ds.close();
        }

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

13 个回复

倒序浏览
Enter键在dos中时“\n”啊 读到的不是空 是“\n”所以还会是执行while里的内容的
回复 使用道具 举报
因为readLine()是对read的强化,只有当readLine()读到-1的时候才会返回null
在读到回车,也就是"\r\n"时,是什么也没打印,而不是null(貌似这两个是有区别的,个人以为打印的是空)
这个是毕老师模拟的readLine()
  1. public String myReadLine() throws IOException {

  2.                 StringBuilder sb = new StringBuilder();
  3.                 int ch = 0;
  4.                 while ((ch = r.read()) != -1) {

  5.                         if (ch == '\r')
  6.                                 continue;
  7.                         if (ch == '\n')
  8.                                 return sb.toString();
  9.                         else
  10.                                 sb.append((char) ch);

  11.                 }
  12.                 if (sb.length() != 0)
  13.                         return sb.toString();
  14.                 return null;
  15.         }
复制代码
回复 使用道具 举报
张学林 发表于 2013-3-6 19:39
因为readLine()是对read的强化,只有当readLine()读到-1的时候才会返回null
在读到回车,也就是"\r\n"时,是什 ...
  1. public static void main(String[] args) throws Exception
  2.         {
  3.                 DatagramSocket ds = new DatagramSocket();
  4.                
  5.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  6.                 String line = null;
  7.                 while ((line=bufr.readLine())!=null)
  8.                 {
  9.                         if ("\r\n".equals(line))//此处加上判读也不行
  10.                         {
  11.                                 System.out.println("发送数据不能为空!");
  12.                                 continue;
  13.                         }
  14.                         if("886".equals(line))
  15.                                 break;
  16.                        
  17.                         byte[] buf = line.getBytes();
  18.                         DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("B2G6ACE50ZNYLME"),10001);

  19.                         ds.send(dp);
  20.                 }
  21.                 ds.close();
  22.         }
复制代码
可是我加上判断也不行
而且readLine()方法返回值包含该行内容的字符串,不包含任何行终止符
回复 使用道具 举报
戴乾刚 发表于 2013-3-6 20:05
可是我加上判断也不行
而且readLine()方法返回值包含该行内容的字符串,不包含任何行终止符
...

试试"\n"
回复 使用道具 举报
戴乾刚 发表于 2013-3-6 20:05
可是我加上判断也不行
而且readLine()方法返回值包含该行内容的字符串,不包含任何行终止符
...

试试“” 行不
回复 使用道具 举报
不是的,"\r\n"是不会被写入readLine()的,因为readLine()也是基于read()
在Windows系统里回车是两个字符"\r\n",而read只是读一个字符
在读到\r的时候,执行continue,结束本次循环,而没有把\r  append给sb,执行下一次循环
这时读\n,然后就返回sb.toString()如果只是敲了回车,sb.toString()这个东西反正不是null到底是啥,我也搞不清楚,可能就是""两个双引号吧
  1.        if (sb.length() != 0)

  2.                   return sb.toString();

  3.                return null;

复制代码
这一句就是为了读CTRL+C的,这个才是Windows的结束,也就是-1
回复 使用道具 举报
刘凯 发表于 2013-3-6 20:11
试试“” 行不

还是不行,不能达到想要的效果
回复 使用道具 举报
"\r\n"   "\r"   "\n"  null   ""全都试过了不知道是啥
但是将读取到的数据输出,直接敲Enter键光标会再换行一次,这样看的话应该是换行符,但是上面的都试过了,又不是、、
回复 使用道具 举报
dos界面下ctr+c是空,那么直接按Enter到底是什么、、、
回复 使用道具 举报
问题还没解决,别沉了、、
回复 使用道具 举报
版主比较强,说两句解释,让还是比较菜的我们讲讲课吧
回复 使用道具 举报
戴乾刚 发表于 2013-3-10 09:22
问题还没解决,别沉了、、

就是“” 验证过了
  1. import java.io.*;
  2. class Test
  3. {
  4.         public static void main(String[] org)throws Exception
  5.         {

  6.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  7.                 String line = null;
  8.                 while((line=br.readLine())!=null)
  9.                 {
  10.                         if(line.equals("over"))
  11.                                 break;
  12.                         System.out.println(line.equals(""));
  13.                 }
  14.         }
  15. }
复制代码
回复 使用道具 举报
本帖最后由 戴乾刚 于 2013-3-15 16:11 编辑
刘凯 发表于 2013-3-14 21:28
就是“” 验证过了

明白了,不能用==号判断,要用equals方法、、谢了
  1. import java.net.*;
  2. import java.io.*;
  3. class UdpSend2
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 DatagramSocket ds = new DatagramSocket();
  8.                
  9.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  10.                 String line = null;
  11.                 while ((line=bufr.readLine())!=null)
  12.                 {
  13.                         if ("".equals(line))     //要用equals方法判断----------------------------------------------------------------------------------------------------------------------------------------                           
  14.                         {
  15.                                 System.out.println("发送数据不能为空!");
  16.                                 continue;
  17.                         }
  18.                         if("886".equals(line))
  19.                                 break;
  20.                         
  21.                         byte[] buf = line.getBytes();
  22.                         DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("B2G6ACE50ZNYLME"),10001);

  23.                         ds.send(dp);
  24.                 }
  25.                 ds.close();
  26.         }
  27. }



  28. class UdpReceive2
  29. {
  30.         public static void main(String[] args)throws Exception
  31.         {
  32.                 DatagramSocket ds = new DatagramSocket(10001);
  33.                 while(true)
  34.                 {
  35.                         byte[] buf = new byte[1024];
  36.                         DatagramPacket dp = new DatagramPacket(buf,buf.length);

  37.                         ds.receive(dp);

  38.                         String ip = dp.getAddress().getHostAddress();
  39.                         String data = new String(dp.getData(),0,dp.getLength());
  40.                         System.out.println(ip+" :: "+data);
  41.                 }
  42.         }
  43. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马