Java Read()阻塞的一种处理方式
java.io.InputStream的read()方法描述:
If no byte is available because the end of the stream has been reached, the value -1 is returned.
到达流的末尾真会放回-1吗?
文件读写中可以返回-1
Socket通讯则有一说,很奇怪我发现c语言似乎读到数据流结尾可以得到-1;而Java中则比较难得到-1,读不到数据时候read()会一直阻塞中,从JDK1.4后很多人是用java.nio,那是另一个话题。
读取socket流中数据,根据-1判断是不现实的(通常定义各自通讯协议),这里没有考虑网络断掉情形,直接读取数据,关键问题就是考虑什么时候退出循环,不在读取数据,否则read()阻塞。思路:用一次读1024字节衡量,最后一次没有读满或者刚好读满时候,表示流中没有数据了。
接收端代码片段:
InputStream is = socket.getInputStream();
int len = 0;
byte[] buf = new byte[1024];
StringBuffer sbf = new StringBuffer();
String temp = null;
int i = 0;
len = is.read(buf);
while(true){
temp = new String(buf,0,len);
sbf.append(temp);
if(len>=buf.length){
len = is.read(buf);
}else{
break ;
}
}
相关文档:
Java Learning Path (一)、工具篇
一、 JDK (Java Development Kit)
JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外, ......
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo ......
import java.util.Date;
class Dog{
private String name;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return b ......
文章用实例代码展示了Java中多线程访问共享资源
时线程同步
的重要性。
分别通过在两个线程中同时访问(调用get_id*方法)经过同步处理(lock及Synchronized)的共享资源(tmp)及未经过同步处理的共享资源(tmp)来说明同步处理的的作用。
main中分两部分:
1)前半部分,non-synchronization部分用来测试没有做同步处理的代码 ......