Uploaded image for project: 'Commons Exec'
  1. Commons Exec
  2. EXEC-102

"Stream closed" error in Java 8 when passing input to processes that don't consume it



    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 1.3
    • Fix Version/s: None
    • Labels:


      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:

      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));
              System.out.println("result: " + output.toString("UTF-8"));

      This program would work fine in Java 7, but in Java 8 it fails with this stack trace:

      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)


          Issue Links



              • Assignee:
                sgoeschl Siegfried Goeschl
                cprice-puppet Chris Price
              • Votes:
                0 Vote for this issue
                3 Start watching this issue


                • Created: