关于Java IO 输入流结束的标志条件 就我所知现在有两种:一个是while(input.read() != -1);另一个是while(input.available()>0),我现在写一个用电脑的串口进行通信的应用程序,用事件进行接收数据,用第一个好像是会出现在数据错误或丢失,第二个好像没有,到底哪方法比较好呢,第一个出现错误的原因是什么,还有第一个好像是到尾都不会返回-1,这个是不是与串口事件中的方法有关,还是它本来就不会退while循环呢?请高手指教下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把你的代码贴出来看看吧,特别是input的实现。 input是电脑串口中用来接收串口中数据BufferedInputStream 的一个实例串口数据是通过事件触发去接收的(当串口中有数据时触发) @Override public void serialEvent(SerialPortEvent e) { // TODO Auto-generated method stub switch (e.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: readComm4(); break; default: break; } }readComm4()为读串口数据的方法 private void readComm4() { BufferedInputStream input = serialBean.getInputStream(); int code; try { byte[] dataBuf = new byte[1041]; System.out.println("into"); while ((code = input.read(dataBuf)) != -1) { } System.out.println("out"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }现在是进入了readComm4()方法打印了into就是出不去那个while循环打印不了out.可以保证输入到串口的数据是少于1041个的. 你说用event方法不会丢失数据,那么问题出在read()方法中,你要贴的是read()的实现呀。 就是类InputStream中的read()方法啊,上面的readComm4()就是读取串口中数据的方法.现在是进入了while()之后就算到接收到串口上的所有数据(即输入流到达流尾),这时程序也没有退出while()循环. read()方法不是说到达流尾就返回-1么? 楼主没有了解具体的协议吧 ?串口通信,也应该遵照某种协议才是。就是通信双方的通信方式和数据格式。楼主这个帖子的标题已经谈到IO流的结束符了,本以为,楼主理解IO结束符呢。楼主调用的input.read方法,只有当IO流结束了或者缓冲区(楼主传的那个数组参数)填满了才会返回。也就是说,这个方法是阻塞读的。为什么没有进行下一次的while循环 ?因为read方法没有返回;为啥没返回,因为,IO根本就没有结束;为啥IO没结束,因为,对方根本没有执行close方法。这回,楼主明白了吗 ?另外,available方法是探测当前系统缓冲区中是否存在数据,不能判断是否是IO的结束符。之后,楼主就会想到了,楼主要的,其实不是IO的结束符,而是,每次数据交互的结束符。具体怎样判断每次交互多少数据,是根据具体协议来判断的。 如何去掉Java中jtree中的背景颜色 怎样用循环语句建立多个相同的对象 java的环境变量配置有问题 为什么我在J2SE6.0里找不到java.swt包啊 请问在多线程环境中,如果得到一个线程的真实运行时间?? zip文件中文问题,急!!明早就要用谢谢大家了。 接口到底是什么,与什么用处啊? 一个语法问题 总算快完成了,但还有一个问题,请专家高手指点,谢谢 jdbc.properties里面url路径到底要这么写? 如何加载jar文件里面的文件 设置了一个errorPage页面,但是不起作用,调试中,源码如下:
串口数据是通过事件触发去接收的(当串口中有数据时触发)
@Override
public void serialEvent(SerialPortEvent e) {
// TODO Auto-generated method stub
switch (e.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
readComm4();
break;
default:
break;
}
}
readComm4()为读串口数据的方法
private void readComm4() {
BufferedInputStream input = serialBean.getInputStream(); int code; try { byte[] dataBuf = new byte[1041];
System.out.println("into");
while ((code = input.read(dataBuf)) != -1) {
}
System.out.println("out"); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
现在是进入了readComm4()方法打印了into就是出不去那个while循环打印不了out.
可以保证输入到串口的数据是少于1041个的.
楼主调用的input.read方法,只有当IO流结束了或者缓冲区(楼主传的那个数组参数)填满了才会返回。
也就是说,这个方法是阻塞读的。为什么没有进行下一次的while循环 ?
因为read方法没有返回;为啥没返回,因为,IO根本就没有结束;
为啥IO没结束,因为,对方根本没有执行close方法。这回,楼主明白了吗 ?另外,available方法是探测当前系统缓冲区中是否存在数据,不能判断是否是IO的结束符。
之后,楼主就会想到了,楼主要的,其实不是IO的结束符,而是,每次数据交互的结束符。
具体怎样判断每次交互多少数据,是根据具体协议来判断的。