You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "fagu (Jira)" <ji...@apache.org> on 2019/09/09 10:15:00 UTC

[jira] [Issue Comment Deleted] (EXEC-102) "Stream closed" error in Java 8 when passing input to processes that don't consume it

     [ https://issues.apache.org/jira/browse/EXEC-102?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

fagu updated EXEC-102:
----------------------
    Comment: was deleted

(was: I maybe found a fix. I ignore the boolean value to close the stream :
{code:java}
executor.setStreamHandler(new PumpStreamHandler(output, output, input) {
  protected Thread createPump(InputStream is, OutputStream os, boolean closeWhenExhausted) {
    return super.createPump(is, os, false);
  }
});{code})

> "Stream closed" error in Java 8 when passing input to processes that don't consume it
> -------------------------------------------------------------------------------------
>
>                 Key: EXEC-102
>                 URL: https://issues.apache.org/jira/browse/EXEC-102
>             Project: Commons Exec
>          Issue Type: Bug
>    Affects Versions: 1.3
>            Reporter: Chris Price
>            Assignee: Siegfried Goeschl
>            Priority: Major
>
> When trying to pass an InputStream to a process (i.e. for it to be used as STDIN), I am getting an IOException in Java 8 that I did not get in Java 7.
> We have observed this behavior with both Oracle JDK8 and OpenJDK8, and on various Red Hat Linux and Ubuntu Linux systems, and also on Mac OSX.
> Here is a simple reproducer:
> {code}
> package foo;
> import org.apache.commons.exec.CommandLine;
> import org.apache.commons.exec.DefaultExecutor;
> import org.apache.commons.exec.Executor;
> import org.apache.commons.exec.PumpStreamHandler;
> import java.io.ByteArrayInputStream;
> import java.io.ByteArrayOutputStream;
> import java.io.IOException;
> public class CommonsExecBinTrue {
>     public static void main(String[] args) throws IOException {
>         Executor exec = new DefaultExecutor();
>         CommandLine cl = new CommandLine("/bin/true");
>         String text = "hello";
>         ByteArrayInputStream input =
>                 new ByteArrayInputStream(text.getBytes("UTF-8"));
>         ByteArrayOutputStream output = new ByteArrayOutputStream();
>         exec.setStreamHandler(new PumpStreamHandler(output, null, input));
>         exec.execute(cl);
>         System.out.println("result: " + output.toString("UTF-8"));
>     }
> }
> {code}
> This program would work fine in Java 7, but in Java 8 it fails with this stack trace:
> {code}
> Exception in thread "main" java.io.IOException: Stream closed
> 	at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433)
> 	at java.io.OutputStream.write(OutputStream.java:116)
> 	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
> 	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
> 	at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
> 	at org.apache.commons.exec.DefaultExecutor.closeProcessStreams(DefaultExecutor.java:306)
> 	at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:387)
> 	at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
> 	at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153)
> 	at foo.CommonsExecBinTrue.main(CommonsExecBinTrue.java:27)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:497)
> 	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.2#803003)