【2011/3/2】(1)关于readLine()方法,readLine方法是BufferedReader类的方法,此方法是对字符进行操作的类,如果到达流末尾,则返回null,

来源:互联网 发布:wifi当前网络不可用 编辑:程序博客网 时间:2024/06/05 08:35

(1)关于readLine()方法,readLine方法是BufferedReader类的方法,此方法是对字符进行操作的类,如果到达流末尾,则返回null,
此方法在无法直接使用字符编码的流中无法使用,在网络传输的过程中Http协议传输的字节流可能是任何形式的数据,可能是某种
编码的字符文本或者是二进制的其它文件如图片、视频、音频等。
不能使用BufferedReader类的原因:
1.BufferedReader类的readLine方法在无法直接使用字符编码的流中无法使用,在网络传输的过程中Http协议传输的字节流可能是任何形式的数据,可能是某种
编码的字符文本或者是二进制的其它文件如图片、视频、音频等。
2.BufferedReader类的readLine方法在读取一行数据的时候不是一碰见就返回一行的,而是读取一个数据段回来,对该数据段进行分析其中的/r/n字符,然后返
回一行的,这就导致我们在读取到一个空行的时候该流的下一个读取点并不就在这个空行的位置,而是包含了空行下面的消息实体的部分信息的,无法精确的定
位空行分隔点。

换行 ('/n')、回车 ('/r')
遇到的问题需求如下:从一个连续不断的字节流中读取判断一个空行,然后提取空行前后的数据。
解决此问题:
1.需要一个可以读取一行的字节操作InputStream包装类
核心算法,此算法版权归属刘亚超
 //此算法是首读取两个字节的数字分别存储,判断如果首次读取的x就是-1直接返回null,
// 然后每次向后挪动一个字节的位置,进行比较/r和/n,并存储x的值,如果y值为0则break跳出循环返回最后一个串
 public String readLine() throws IOException{
  
  int x = ips.read();
  if(x==-1)
   return null;
  int y = ips.read();
  
  while(!(x=='/r' & y=='/n')){
   baos.write(x);
   x = y;
   y = ips.read();
   if(y==-1)
    break;
  }
  
  String result = new String(baos.toByteArray());
//  System.out.println(baos.toByteArray().length);
  baos.reset();
//  System.out.println(result);
  return result;
 }

2.使用该类来读取行设计条件当读到一个行的信息为一个空的字符串的时候即找到了该分割点,问题得以解决。
 String line = iis.readLine();
   while(line!=null && !line.equals("")){
    System.out.println(line);
    line = iis.readLine();
   }