我使用DataStream包装FileStream在两个不同的应用程序之间发送大位图(Intent有1mb的限制,我不想将文件保存到文件系统),
我的问题是,当流仍处于打开状态但没有数据时DataInputStream正在抛出EOFException
。我希望这可以简单地阻止(尽管文档在这个问题上有点模糊)。
DataOutputStream类:
public void onEvent() {
fos.writeInt(width);
fos.writeInt(height);
fos.writeInt(newBuffer.length);
fos.write(newBuffer);
}
DataInputStream类:
while(true) {
int width = fis.readInt();
int height = fis.readInt();
int length = fis.readInt();
byte[] bytes = new byte[length];
fis.read(bytes);
}
任何人都可以建议一组更好的类来将数据从一个线程传输到另一个线程(其中,read()/ readInt()成功阻止)。
修改
我尝试通过简单地使用DataInputStream
和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
这是疯狂的感觉吗?
答案 0 :(得分:0)
这里的答案相当简单(没有很好的记录)。
FileInputStream对它的read
请求没有超时 - 这意味着如果你从空的但未关闭的流中读取它将返回而不填写字节(保留“按原样”给出的字节)。
您可以使用LocalSocket
和LocalServerSocket
通过相同的机制流式传输数据并使用
LocalServerSocket server = new LocalServerSocket(SOCKET_NAME);
LocalSocket socket = server.accept();
socket.setSoTimeout(60);
这将强制您在读取操作时超时60秒(阻塞直到数据可用)。