0

我正在使用包装 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从等式中删除DataInputStreamand来解决这个问题:DataOutputStreamFileInputStreamFileOutputStream

    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

这就是疯狂的感觉吗?

4

1 回答 1

0

这里的答案相当简单(没有很好的记录)。

FileInputStream 的请求没有超时read- 这意味着如果您从一个空但未关闭的流中读取,它将返回而不填充字节(保持“原样”给出的字节)。

您可以使用LocalSocketLocalServerSocket通过相同的机制流式传输数据并使用

LocalServerSocket server = new LocalServerSocket(SOCKET_NAME);
LocalSocket socket = server.accept();
socket.setSoTimeout(60);

这将强制您的读取操作超时 60 秒(阻塞直到数据可用)。

于 2013-04-18T08:29:15.770 回答