【问题标题】:Is there a limit on process input stream when using java?使用java时对进程输入流有限制吗?
【发布时间】:2012-10-14 19:44:48
【问题描述】:

我在 solaris 操作系统上使用 java 运行时创建一个进程。然后我从进程中获取输入流并读取输入流。我希望(我不太确定这个过程,它是第 3 方的事情)这个过程外流会很大,但它似乎被剪裁了。会不会是java端有一个阈值,一个进程可以在其输出流中有多少?

谢谢, 阿卜杜勒

【问题讨论】:

  • 是的,尝试从命令行启动进程并将输出与您在 Java 中收到的输出进行比较应该没有问题。

标签: java process operating-system exec


【解决方案1】:

如果您反复阅读,您可以阅读的数据量没有限制。您一次不能读取超过 2 GB 的数据,并且某些流类型可能一次只能为您提供几 KB。例如慢速 Socket 通常会给你 1.5 KB 或更少(基于连接的 MTU)

如果您调用int read(byte[]),则只能保证读取 1 个字节。假设您每次都会读取完整的缓冲区是一个常见的错误。如果你需要这个,你可以使用DataInputStream.readFully(byte[])

【讨论】:

  • DataInputStream.readFully 函数的文件大小是否有限制?
  • @Aavik 该文件需要至少有 byte[] 的 length 尚未读取,否则将引发 IOException。否则它可以是任意大小。
【解决方案2】:

如果正确实施,您不应该遇到InputStreamOutputStream 的限制。当从输入或输出分配对象时,最有可能遇到限制的资源是内存 - 例如,尝试将 100GB 文件读入内存然后写入输出。如果您需要将非常大的对象加载到内存中或从流中加载,请确保使用 64 位 JVM 并为其分配尽可能多的内存,但测试是确定理想值的唯一方法。

【讨论】:

  • 你是对的,我试图更新我的答案以使其更清楚。我的意思是,如果您要分配非常大的对象以写入 OutputStream,您可能会遇到内存问题,而不是流的实际限制。
【解决方案3】:

“处理输出流”是指 STDOUT 吗?标准错误?或者您有一个指向某处的 OutputStream 对象? (一个文件?)

如果您写入文件 - 如果您不关闭输出流,您可能会看到剪辑数据。只要您按书阅读(完成写作后的 outputstream.close() ),您就可以开始了。请注意,存在一些潜在限制,例如存储空间(显而易见)或文件系统限制(某些限制文件大小)。

如果你写信给 STDOUT/STDERR - 据我所知你很好。再次注意,如果您将输出写入终端,或者通过 Eclipse(例如),那么它们可能有一个缓冲区,因此会限制您的输出(但是,您很可能会丢失数据的第一部分并且不是最后一部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2016-09-26
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多