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