最近的项目是关于Usb host的,在进行文件互导时发现一些问题
使用pull拉取文件时,分段读取的DATA及大小不准确
解决方法:
在没有读取到DONE字符前,需要一直读取out端口,直到没有数据流为止,否则会影响下次操作。
对于上次的缓存,如果大小超出真实文件大小,则从末尾截取包含DONE信息的缓存,否则清空缓存,重新读取out端口
PS:结束操作的情况只能是获取到DONE或out端口没有新数据。
附上接收的方法
public int receive(final int streamId, final int peerStreamId,
ByteBuffer packetBuffer, ByteBuffer buffer) {
int result = 0;
try {
int offset = 0;
boolean hasNext = true;
while (hasNext) {
int packetDataSize = 0;
if (0 == packetBuffer.position()) {
byte[] payloadBuffer = new byte[AdbMessage.MAX_PAYLOAD];
if (0 < (packetDataSize = read(streamId, peerStreamId,
payloadBuffer))) {
packetBuffer.put(payloadBuffer, 0, packetDataSize);
packetBuffer.rewind();
if (0 == offset) {
byte[] cmd = new byte[4];
if (packetDataSize >= 4) {
packetBuffer.get(cmd);
if ("DATA".equalsIgnoreCase(new String(cmd))) {
offset = packetBuffer.getInt();
packetDataSize -= 8;
} else if ("DONE".equalsIgnoreCase(new String(
cmd))) {
return result;
} else {
result = -1;
return result;
}
} else {
result = -1;
return result;
}
}
} else {
break;
}
} else {
packetDataSize = packetBuffer.capacity()
- packetBuffer.position();
byte[] cmd = new byte[4];
if (packetDataSize >= 4) {
packetBuffer.get(cmd);
if ("DATA".equalsIgnoreCase(new String(cmd))) {
offset = packetBuffer.getInt();
packetDataSize -= 8;
} else if ("DONE".equalsIgnoreCase(new String(cmd))) {
return result;
} else {
packetBuffer.clear();
continue;
}
} else {
packetBuffer.clear();
continue;
}
}
if (0 == result) {
if (offset >= packetDataSize) {
if (buffer.remaining() >= packetDataSize) {
if (0 < packetDataSize) {
buffer.put(packetBuffer);
offset -= packetDataSize;
}
packetBuffer.clear();
} else {
if (buffer.remaining() <= 0) {
packetBuffer.clear();
continue;
}
offset = buffer.remaining() + 4;
packetBuffer.position(packetBuffer.capacity()
- offset);
}
} else {
if (buffer.remaining() <= 0) {
packetBuffer.clear();
continue;
}
if (buffer.remaining() >= offset) {
buffer.put(packetBuffer.array(),
packetBuffer.position(), offset);
packetBuffer.position(packetBuffer.position()
+ offset);
offset = 0;
} else {
result = -1;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
return -1;
} catch (StackOverflowError e) {
e.printStackTrace();
return -1;
} catch (OutOfMemoryError e) {
e.printStackTrace();
System.gc();
return -1;
}
return result;
}