Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
InputStream类的方法:

int read() 从输入流中读取一个字节的内容,并且把这个内容以整数的形式返回。如果碰到流的结束处,那么返回的值就是“-1”;如果流没有结果,但临时没有数据可读,那read方法就将阻塞运行程序的执行过程,至到流中有新的数据可读。

 

"到达流末尾,read方法返回的是-1",即意味着流中没有数据了,这一般用于判断读取文件内容是结束,即文件的结束符标志位;

如果是在socket上读,根据我的经验,这个方法是不灵光的,会有3种情况:
1. 网络断掉的话,抛出IOException;
2.例如流中只有八个字节了(对端仅写入了这么多)而你要read第9个,则抛出EOFException,
第三种情况要看你设置的socket的timeOut的值了,网络中读取时,不能根据read返回是否为-1决定是否还有数据,read时会block到超时再返回。

所以类似于下面的代码:

                InputStream in = clientSocket.getInputStream();

                int n = 0;
                byte[] buf = new byte[1024];
                String recvSocketMsg = "";
                while ((n = in.read(buf)) > 0) {
                    recvSocketMsg += new String(buf, 0, n);
                }

想要server不永远处在while里面,OutputStream必须close,或者给个结束符,flush是没用的。

但是out.close会把socket整个关掉,也就是说InputStream也用不了了。

Server端可以这样

                InputStream is = clientSocket.getInputStream();

int count = 0;
while (count == 0) {
count = is.available();
}
byte[] b = new byte[count];
is.read(b);

String recvSocketMsg = new String(b, 0, count);

但是,以上方法可能读不到末尾,目前原因未知,可能是网络问题导致is.available()返回不正确,在已知报文格式的情况下,可以设置读到某个字符终止

           while((readInt=input.read()) != -1) {  
request += (char)readInt;
if(request.indexOf("</endXML>") != -1){
break;
}

以上是一个字节读入,遇到中文会乱码,可以改用以下方法

               int n = 0;
byte[] buf = new byte[3072];
while ((n = is.read(buf)) > 0) {
recvSocketMsg += new String(buf, 0, n);
if (recvSocketMsg.indexOf("</CFX>") != -1) {
break;
}
}

http://blog.sina.com.cn/s/blog_565ea189010001fp.html

http://www.iteye.com/topic/165013

http://my.oschina.net/hunterli/blog/14938

http://ansonlai.iteye.com/blog/556287

posted on 2012-03-22 14:42  NickyYe  阅读(1393)  评论(0编辑  收藏  举报