关于字节流读取,int和byte的区别
大体是读传来的字节数据。但发现用int接收和byte接收有一点区别
问题源码如下:
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
mFileInputStream = (FileInputStream)getInputStream();
byte[] temp = null;
while (!isInterrupted()) {
temp = null;
if (mFileInputStream != null) {
try {
int i = 0;
int bb;
temp = new byte[1024];
do {// 一个字节一个字节的读
bb = mFileInputStream.read();//当读到最后个字节时,也就是-1,程序就在这里停下了了,没有去执行后面的list.add(),导致list.size为0
temp[i] = (byte)bb;
i++;
} while (bb!=-1); // 保证结束符为-1
if(flag==true){//清空ArrayList集合,释放资源
list.clear();
}//用ArrayList<byte[]>来存放byte数组,这样能缓存接收的数据
list.add(Arrays.copyOf(temp, i));//用Arrays.copyOf()来传递,可以确定这个数组的具体长度
flag=false;//把标志位改回不清空状态
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
而用byte的可行源码如下:
/**
* 接收,当收到“0xf5”时,就会结束。单开一个线程来进行接收才有效果。
*/
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
mFileInputStream = (FileInputStream)getInputStream();
byte[] temp = null;
while (!isInterrupted()) {
temp = null;
if (mFileInputStream != null) {
try {
int i = 0;
byte bb;
temp = new byte[1024];
do {// 一个字节一个字节的读
bb = (byte)mFileInputStream.read();
temp[i] = bb;
i++;
} while (bb!=(byte)0xf5); // 保证结束符为-1
if(flag==true){//清空ArrayList集合,释放资源
list.clear();
}//用ArrayList<byte[]>来存放byte数组,这样能缓存接收的数据
list.add(Arrays.copyOf(temp, i));//用Arrays.copyOf()来传递,可以确定这个数组的具体长度
flag=false;//把标志位改回不清空状态
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
由于read()方法的返回值为int型的-1时,表示后面没数据了,前一个有问题片段中“bb = mFileInputStream.read()”,用int型的bb来接收read(),当它得到返回是-1,它似乎立即停掉了当前线程,导致后面的list.add()方法没有实行,最后的list.size为0.而后有一个片段,用byte型的bb来接收read(),判断结束位“f5”,可以正常执行到list.add()。那么,就有问题了,read()的源码里是如何去判断结束符的?为什么read()到结束符后,它会停掉当前线程或者说是跳出了当前程序(反正没有执行到后面的list.add()方法)?