说对了!
InputStream的available()值总是0,因为它是一个抽象类!
public abstract class InputStream {
......
    public int available() throws IOException {
return 0;
    }
......
}网络传输都是要用到buffer的,tcp/ip也是如此。你又何苦一次就希望读完呢。

解决方案 »

  1.   

    错误,InputStream的available()值总是0,并不是因为它是一个抽象类!!!!available的意思不是说这个流还有多少有效的数据的意思,只是说在不Blocking的情况下面还有多少数据可以用应该改成
        String message = "";
          while (in.available() != 0) {
            message += in.read();
          }
    ByteArrayOutputStream bao = new ByteArrayOutputStream();
    for(int read = is.read(); read >= 0; read = is.read())
      bao.write(read);//read是一个字节而不是一个字符!!!!!message = bao.toString();
      

  2.   

    顺序写错了:    String message = "";
          while (in.available() != 0) {
            message += in.read();
          }应该改成ByteArrayOutputStream bao = new ByteArrayOutputStream();
    for(int read = is.read(); read >= 0; read = is.read())
      bao.write(read);//read是一个字节而不是一个字符!!!!!message = bao.toString();
      

  3.   

    to  ChDw(米)  
    我在上一贴中附了部分InputStream的代码。相比你也看到了,可能是我说得不够准确。但是实际上就是应该这个意思。请看api的接口描述:
    available
    public int available()
                  throws IOExceptionReturns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream. The next caller might be the same thread or or another thread. 
    The available method for class InputStream always returns 0. This method should be overridden by subclasses. 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Returns:
    the number of bytes that can be read from this input stream without blocking. 
    Throws: 
    IOException - if an I/O error occurs.
    那么为什么他不把InputStream的available()方法明确的写成抽象方法呢?我想这个跟util包下的那些容器类类似,鼓励你用基类或者接口来传递,至于有没有实现就要看具体的实现的类了。
      

  4.   

    这么说可能还是不够说服力。
    因为既然能够通过InputStream in = request.getInputStream()获得一个inputstream,就足以表明肯定是有一个能够被实例化子类,而不是那个抽象类InputStream。那么这个自类是什么呢?javax.servlet.ServletInputStream!
    看看这个类的继承关系:
    java.lang.Object
      |
      +--java.io.InputStream
            |
            +--javax.servlet.ServletInputStream
    而恰恰这个类是没有重写available()的,只是多了一个 int readLine(byte[] b, int off, int len)  方法。所以用available()方法肯定是的到0值的。
      

  5.   

    to takecare(大厅) 你仍然说错了!ServletInputStream的确没有重新覆盖了available方法,但是你发现ServletInputStream是abstract的没有???在任何一个Web服务器中,request.getInputStream返回的都是这个服务器自己写的一个子类,如在Tomcat 5中就是org.apache.coyote.tomcat5.CoyoteInputStream,你可以明确的看到它的实现方法是覆盖了available的!!!!
      

  6.   

    返回的status的值是200 证明已经连上了  但是应用了楼上的方法以后  在server端还是取不到数据客户端的代码如下:os = huc.getOutputStream();
         String message = "";
          
          ByteArrayOutputStream bao = (ByteArrayOutputStream)os;
          for(int read = in.read(); read >= 0; read = in.read())
            bao.write(read);//read是一个字节而不是一个字符!!!!!      message = bao.toString();
    System.out.println("message============"+message); 此时打印出来的是我所要的server的代码如下:
    xml_data = request.getInputStream();
          
          byte[] bytes = new byte[1024];
          bis = new BufferedInputStream(xml_data);
          StringBuffer outstr = new StringBuffer();
          int readlen = -1;
          while ( (readlen = bis.read(bytes, 0, 1024)) > -1) {
            outstr.append(new String(bytes, 0, readlen));
          }
    System.out.println("message==============="+outstr.toString());此时打印出来的结果是  message===============也就是说  在server端的程序没有受到来自客户端发来的代码  不明白是怎么回事情?
      

  7.   

    而且很怪异的是,如果我不再客户端的最后加上一下几句话:
    int status = huc.getResponseCode();
          if(status != huc.HTTP_OK){
            throw new IOException("HTTP response code: " + status);
          }好像在server端根本就没有什么反应不清楚这是为什么?难道是我写的方式有问题吗?请ggjjddmm继续指点一下下  感激涕零