BufferReader和Scanner的使用

BufferReader字符输入流,Scanner扫描类,通过这两个类对InputStream进行包装就可以进行读取数据了。但这两个类都有各自的优缺点,下面来介绍下:

使用BufferReader,我们通常使用它的readerLine()方法,该方法是一个阻塞方法,当没有数据读取时,就一直会阻塞在那不返回null,造成EOFException异常

(1)     读取返回null的情况:当数据读取完后并不会一定返回null,只有当数据流发生异常、服务器另一端被close时才会返回null,才能读取结束

(2)    正常读取数据:当数据读取到BufferReader的默认上限8192个字符时、遇到"/r""/n""/r/n"时才会返回,我们才获取到了读取的数据。

StringBuilderbuilder = new StringBuilder();

           try {

                 URLConnection conn =arg0[0].openConnection();// 创建网络连接对象

                 BufferedReader reader=newBufferedReader(new InputStreamReader(

                            conn.getInputStream(),"UTF-8"));

      // reader.readLine()就造成阻塞了

                  while((line=reader.readLine())!=null){

               builder.append(line+"/n");

                hasRead++;

                publishProgress(hasRead);//通知进度刷新

            }

                 reader.close();

           } catch (IOException e) {

                 e.printStackTrace();

           }

           return builder.toString();

      }

上述网络获取数据BufferReader读取数据就可能造成java.io.EOFException异常,就是数据中不包含/n/r造成的阻塞。

1.    读入的数据要注意有/r或/n或/r/n

2.    没有数据时会阻塞,在数据流异常或断开时才会返回null

3.    使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行或回车符而一直阻塞

读取数据还可以使用Scanner,但Scanner只要遇到空格键,Tab键,Enter,就会返回下一个输入,若我们的数据中包含空格等,则不会被输出出来。此时就要使用bufferReader了。

StringBuilder builder = new StringBuilder();

              try {

                     URLConnectionconn = arg0[0].openConnection();// 创建网络连接对象

                     Scannerreader = new Scanner(new InputStreamReader(

                                   conn.getInputStream(),"UTF-8"));

                     String line= null;

                     while(reader.hasNext()) {

                            builder.append(reader.next());

                     }

                    

                     reader.close();

              } catch(IOException e) {

                     e.printStackTrace();

              }

              return builder.toString();

       }

这样就可以读取数据了。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值