我正在使用包装 FileStream 的 DataStream 在两个不同的应用程序之间发送大位图(意图有 1mb 限制,我不想将文件保存到文件系统),
我的问题是当流仍然打开但没有数据时DataInputStream抛出一个。EOFException
我希望这会简单地阻止(尽管文档在此问题上非常含糊)。
数据输出流:
public void onEvent() {
fos.writeInt(width);
fos.writeInt(height);
fos.writeInt(newBuffer.length);
fos.write(newBuffer);
}
数据输入流:
while(true) {
int width = fis.readInt();
int height = fis.readInt();
int length = fis.readInt();
byte[] bytes = new byte[length];
fis.read(bytes);
}
谁能建议一组更好的类来将数据从一个线程流式传输到另一个线程(其中,read() / readInt() 成功阻塞)。
编辑
我试图通过简单地使用and从等式中删除DataInputStream
and来解决这个问题:DataOutputStream
FileInputStream
FileOutputStream
fos.write(intToByteArray(width));
fos.write(intToByteArray(height));
fos.write(intToByteArray(newBuffer.length));
Log.e(this.class.getName(), "Writing width: " + Arrays.toString(intToByteArray(width)) +
", height: " + Arrays.toString(intToByteArray(height)) +
", length: " + Arrays.toString(intToByteArray(newBuffer.length)));
fos.write(newBuffer);
if(repeat == -1) {
Log.e(this.class.getName(), "Closing ramFile");
fos.flush();
fos.close();
}
这使:
Writing width: [0, 0, 2, -48], height: [0, 0, 5, 0], length: [0, 56, 64, 0]
另一方面,我使用这个:
while(true) {
byte[] intByteArray = new byte[] { -1,-1,-1,-1 };
fis.read(intByteArray);
Log.e(this.class.getName(), Arrays.toString(intByteArray));
int width = toInt(intByteArray, 0);
fis.read(intByteArray);
int height = toInt(intByteArray, 0);
fis.read(intByteArray);
int length = toInt(intByteArray, 0);
Log.e(this.class.getName(), "Reading width: " + width + ", height: " + height + ", length: " + length);
}
这使:
[0, 0, 2, -48]
Reading width: 720, height: 1280, length: 3686400
然后奇怪的是,read()
它没有阻塞,它只是愉快地进行,没有阻塞但没有填充数组中的任何值(将数组初始化为 { 9, 9, 9, 9 } 之后仍然是 9, 9, 9, 9读)。
[-1, -1, -1, -1]
Reading width: -1, height: -1, length: -1
java.lang.NegativeArraySizeException: -1
这就是疯狂的感觉吗?