那么如何确定InputStream的大小而开辟相应大小的byte[]?这个byte[]的大小可以根据文件的大小来确定。也可以根据每次读进的东西的大小来确定。比如可以这样byte[] b=new byte[500];
int s=in.read(b,0,500);
int i=0;
while(s!=-1){
   System.out.println(i+++":"+s);
   s=in.read(b,0,500);
}
System.out.println("这时候的返回结果:"+s);

解决方案 »

  1.   

    int c = 0;
    while ((c = is.read()) != -1) {
       //do something...
       //循环似乎挂在这里了
    }
    if (c == -1) {
      System.out.println("client's c = -1 now...");  //没有被打印出来
    }
      

  2.   

    socket的inputstream是同步的,如果没有接收到数据,那程序就一直作read操作,直到有数据到达。当然你也可以设置setSoTimeout来定时跳过read这一步。
      

  3.   

    只要连接没有关闭,Socket的根本无法知道服务器是不是已经没有数据过来了,所以它只好一直等待服务器的发送数据如果服务器主动Close了Socket,read就会知道并返回-1通过你已经结束了或者你在客户端设置了setSoTimeout,这样在没有数据的情况等待时间超过了,系统会抛出异常的
      

  4.   

    to xitianjile:
    byte[]的大小可以根据文件的大小来确定,如何实现呢?
    比如要传输某个文件,在接收这方需要开辟一个相同大小的byte[]来接收,文件的大小又如何取得,又如何判断文件已经传输结束呢?难道只能在发送方写入某个结束符吗,比如"/r/n"用来表示结束吗?
      

  5.   

    in.read()方法在inputstream没有数据的时候会一直阻塞下去,直到能读出数据或者connection resetsetSoTimeout会抛出SocketException,Sun 并不推荐用Exception来控制程序流程,这样会增加消耗JDK 1.4 开始有SocketChannel类 的无阻塞模式,可以在read的时候不用一直阻塞下去.让其他线程运行JDK 1.4 以下可以用程序模拟实现无阻塞状态忘了当时写的时候为什么用ByteBuffer类来存储byte...byte[] 好像碰到了点什么问题-_-;
      

  6.   

    想起来了...ByteBuffer有个flip方法Flips this buffer. The limit is set to the current position and then the position is set to zero. If the  is defined then it is discarded.方便取适当长的数组...