InputStream类和OutputStream类的读写

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

转载于:https://www.cnblogs.com/NickyYe/archive/2012/03/22/2411598.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值