当前位置: 首页 > 面试题库 >

为什么可以从Process的InputStream块中读取全部数据

裴鸿熙
2023-03-14
问题内容

Java:

Process p = Runtime.getRuntime().exec("myCommand");
final InputStream in = p.getInputStream();

new Thread()
{
    public void run()
    {
        int b;
        while ((b = in.read()) != -1) // Blocks here until process terminates, why?
            System.out.print((char) b);
    }
}.start();

CPP:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    printf("round 1\n");

    // At this point I'd expect the Java process be able
    // to read from the input stream.

    sleep(1);

    printf("round 2\n");

    sleep(1);

    printf("round 3\n");

    sleep(1);

    printf("finished!\n");

    return 0;

    // Only now InputStream.read() stops blocking and starts reading.
}

InputStream.read()的文档指出:

该方法将阻塞,直到可用输入数据,检测到流的末尾或引发异常为止。

是的,我知道这一点(因此与Linux相关吗?):

java.lang.Process:
因为某些本机平台仅为标准输入和输出流提供了有限的缓冲区大小,所以未能及时写入子流程的输入流或读取子流程的输出流可能导致子流程阻塞甚至死锁。

我的问题是:

  1. 为什么InputStream.read()会阻塞,尽管在过程开始后我应该已经有可用数据了?我双方都缺少什么吗?

  2. 如果与Linux相关,是否有任何方法可以在不阻塞的情况下从进程的输出流中进行读取?


问题答案:

为什么尽管有数据,但仍要从Process的InputStream块读取

没有。这里的问题是,当您认为数据 不可 用时,数据 是不可 用的,这是由于在发送者处进行缓冲所致。

您可以fflush()按照@MarkkuK。的注释或告诉您stdio根本不缓冲stdout,来克服它。



 类似资料:
  • 问题内容: 具体来说,问题是编写这样的方法: 如果数据在“超时”毫秒内可用,则返回值与in.read()相同,否则为-2。在方法返回之前,所有产生的线程必须退出。 为避免自变量,此处的主题为java.io.InputStream,如Sun(任何Java版本)所记录。请注意,这并不像看起来那么简单。以下是Sun的文档直接支持的一些事实。 in.read()方法可能是不可中断的。 将InputStre

  • 在我的应用程序中,我通过蓝牙接收传感器数据,并希望以高效的方式读取数据。数据流如下所示:

  • 几个相关问题: 是什么导致第一次读取返回1179字节?某种文件头? 为什么从中读取的内容分页到2048字节的大小,而不是包装指定的值? 是否有方法将配置为从缓冲区读取2048字节以上?

  • 我正在尝试从Java应用程序的Google Sheets API。我已经访问了教程中提到的文件,但我无法访问我自己创建的任何文件。 这是我使用的代码: 我在Drive中手动创建了一个电子表格,用字符串填充A1: B,并从URL中复制了id,看起来像“1IeoY5jY3Su86x1uvgc1yJqEU-6dd6FdUKo8Yf5J73k”(不是实际的ID)。 这将生成错误400无法解析范围:类数据!

  • 问题内容: 我很惊讶即使在Java中发生故障后仍可以继续执行。 我知道那是Error类的一个子集。错误类Error被贬义为“ Throwable的子类,它指示合理的应用程序不应尝试捕获的严重问题”。 这听起来像是一条建议,而不是一条规则,这表明实际上允许捕获像StackOverflowError这样的错误,这取决于程序员的合理性。看到了,我测试了这段代码,它正常终止。 怎么会这样?我认为,当引发S

  • 问题内容: 我正在尝试读取文本文件,我正在使用fileImputStream,并将所有行读取到单个String中,然后将其输出到控制台(System.out) 当我尝试读取humanSerf.txt时,它在consol中为我提供了这一点: 在文本文件中,它说: 如何使怪异的文字消失? 这是我正在使用的代码,请帮助 如何使怪异的文字消失?ps,这是在mac textedditor中完成的 问题答案: