Java 在Android应用程序中将大字节数组管道化到进程中
我正在做一个项目,目前的结构最能发挥作用 将1.2MB文件发送到托管ARM进程的stdin。 在Java中,此进程是使用Java 在Android应用程序中将大字节数组管道化到进程中,java,android,embedded-linux,Java,Android,Embedded Linux,我正在做一个项目,目前的结构最能发挥作用 将1.2MB文件发送到托管ARM进程的stdin。 在Java中,此进程是使用ProcessBuilder创建的, 并尝试使用 os.write(buf)导致 以下堆栈跟踪,指示写入 导致进程/管道终止。 这种写操作适用于较小的缓冲区 100字节 我试过使用Apache的IOUtils,BufferedOutputStream, 和OutputStreamWriter,但它们都会导致进程终止 我尝试过将写入分块,以一次发送1k字节 时间如下面的代码片段
ProcessBuilder
创建的,
并尝试使用
os.write(buf)
导致
以下堆栈跟踪,指示写入
导致进程/管道终止。
这种写操作适用于较小的缓冲区
100字节
我试过使用Apache的IOUtils,BufferedOutputStream,
和OutputStreamWriter,但它们都会导致进程终止
我尝试过将写入分块,以一次发送1k字节
时间如下面的代码片段所示
int chunkSize = 1000, sentBytes = 0, i = 0;
while (sentBytes < b.length) {
Log.d(TAG, "Writing chunk " + i);
int sz = sentBytes+chunkSize > b.length ? b.length % chunkSize : chunkSize;
os.write(b, i*chunkSize, sz);
os.flush();
sentBytes += chunkSize; i++;
}
int chunkSize=1000,sentBytes=0,i=0;
while(sentBytesb.length?b.length%chunkSize:chunkSize;
写(b,i*chunkSize,sz);
os.flush();
sentBytes+=chunkSize;i++;
}
但是,在崩溃之前,它只能发送68k字节。
我已经运行过多次,代码总是崩溃
在写第68块的时候
我试着做一个简单的工作示例来尝试
来隔离这个问题。然而,这段代码是完全错误的
尝试写入1MB数据时挂起。
当写入100字节时,此代码正确运行
我不确定我是否在寻找正确的术语,但是
以下是我发现的一些相关帖子,没有地址
这个问题
OutputStream
在Android Java中管理的进程
?
我还可以尝试哪些其他方法
我的备份计划是修改子流程以不读取这么多数据
从
stdin
,但这种修改并不理想。首先是第二个问题<默认情况下,code>ProcessBuilder将安排您的子进程“stdin
和stdout
连接到您的程序。您的测试程序生成cat
,并将1MB的数据写入其stdin
。但是cat
的工作是将它的stdin
复制到它的stdout
,而你永远不会从它的stdout
读取!一旦内核的管道缓冲区填满,cat
将因此在尝试写入时阻塞。由于它被阻塞,它不再从其stdin
读取数据,因此您的程序依次阻塞
您的原始程序有一个不同的问题:EPIPE上的写入失败,而不是挂起。正如您所指出的,这意味着子进程已终止(或至少已关闭其
stdin
)。您的helper进程不知道或不关心您正在使用哪个javaapi:它只是从管道中读取,POSIX管道机制中没有任何东西可以导致管道读取器退出。(另一方面,如果最后一个读卡器消失,写入程序可能会被SIGPIPE
杀死。)您是否排除了正在发送的数据的内容中的某些内容导致助手进程退出的可能性?确实,我没有将正确的数据发送到程序的输入流。谢谢