while (!isTerminated) {
Socket socket = getSocket();
int offset = 0;
int maxLength = 256 * 1024;
byte[] buffer = new byte[maxLength];
int readLength = socket.getInputStream().read(buffer, offset, maxLength);
if (readLength == -1) {
System.out.println("EOF Error!");
offset = 0;
} else {
offset += readLength;
}
if (offset >= maxLength) {
offset = 0;
}
}
运行结果表明有时候会连续几十次报EOF错我, 请高手指点!
谢谢
12 个解决方案
#1
好象是文章结束
#2
读取流的结尾了,或没有流
#3
楼上2位说的我明白。 可是为什么会读到流的结尾呢?
至于说没有流,估计不太可能, 否则会空指针异常的!
请大家帮忙阿! 最近几天为这事郁闷死了!
至于说没有流,估计不太可能, 否则会空指针异常的!
请大家帮忙阿! 最近几天为这事郁闷死了!
#4
没有人肯帮忙啊?
#5
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
这个与C中的流含义是一样的,
#6
楼上的没错。
#7
if (readLength == -1) {
System.out.println("EOF Error!");
offset = 0;
楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
System.out.println("Data stream read end!");
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
System.out.println("EOF Error!");
offset = 0;
楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
System.out.println("Data stream read end!");
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
#8
键盘输入结束是 ctrl+z,回车一般应用中表示输入的被确认,把输入缓冲区中的提交给应用
#9
来了好多高人哦,多谢各位!
tanghuan():
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
zhuangnet():
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?
正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?
感谢!
tanghuan():
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
zhuangnet():
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?
正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?
感谢!
#10
利用循环读,一直读到流结尾,阻塞读是表示要一直等到有可以读的数据时候,read方法才会返回
#11
InputStream in;
...
byte[] buff=new byte[1024];
int len;
while ((len=in.read(buff))>-1){
if (len>0){
//已经读到数据,处理这些数据
//注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
}
}
System.out.println("流读完");
in.close()
...
byte[] buff=new byte[1024];
int len;
while ((len=in.read(buff))>-1){
if (len>0){
//已经读到数据,处理这些数据
//注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
}
}
System.out.println("流读完");
in.close()
#12
up!
#1
好象是文章结束
#2
读取流的结尾了,或没有流
#3
楼上2位说的我明白。 可是为什么会读到流的结尾呢?
至于说没有流,估计不太可能, 否则会空指针异常的!
请大家帮忙阿! 最近几天为这事郁闷死了!
至于说没有流,估计不太可能, 否则会空指针异常的!
请大家帮忙阿! 最近几天为这事郁闷死了!
#4
没有人肯帮忙啊?
#5
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
这个与C中的流含义是一样的,
#6
楼上的没错。
#7
if (readLength == -1) {
System.out.println("EOF Error!");
offset = 0;
楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
System.out.println("Data stream read end!");
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
System.out.println("EOF Error!");
offset = 0;
楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
System.out.println("Data stream read end!");
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
#8
键盘输入结束是 ctrl+z,回车一般应用中表示输入的被确认,把输入缓冲区中的提交给应用
#9
来了好多高人哦,多谢各位!
tanghuan():
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
zhuangnet():
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?
正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?
感谢!
tanghuan():
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情
这个与C中的流含义是一样的,
zhuangnet():
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?
正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?
感谢!
#10
利用循环读,一直读到流结尾,阻塞读是表示要一直等到有可以读的数据时候,read方法才会返回
#11
InputStream in;
...
byte[] buff=new byte[1024];
int len;
while ((len=in.read(buff))>-1){
if (len>0){
//已经读到数据,处理这些数据
//注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
}
}
System.out.println("流读完");
in.close()
...
byte[] buff=new byte[1024];
int len;
while ((len=in.read(buff))>-1){
if (len>0){
//已经读到数据,处理这些数据
//注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
}
}
System.out.println("流读完");
in.close()
#12
up!