java.io.StreamCorruptedException:在与子级和父级通信时,在子级中写入标准输出时,流标头无效,ProcessBuilder

java.io.StreamCorruptedException:在与子级和父级通信时,在子级中写入标准输出时,流标头无效,ProcessBuilder,java,io,processbuilder,objectinputstream,Java,Io,Processbuilder,Objectinputstream,我有一个代码段,其中创建了一个新的子进程,一些新进程操作结果需要从子进程发送到父进程。因此,我从子类ObjectOutputStream=new ObjectOutputStream(System.out)创建了一个新的ObjectOutputStream到标准输出和序列化子进程中的对象并发送到父进程,反序列化在父进程中完成 它工作正常,没有问题。但是当我尝试在子代码中使用System.out.println()时,问题就出现了,在子代码中它也在写入标准输出。父进程也尝试反序列化System.o

我有一个代码段,其中创建了一个新的子进程,一些新进程操作结果需要从子进程发送到父进程。因此,我从子类
ObjectOutputStream=new ObjectOutputStream(System.out)创建了一个新的ObjectOutputStream到标准输出
和序列化子进程中的对象并发送到父进程,反序列化在父进程中完成

它工作正常,没有问题。但是当我尝试在子代码中使用
System.out.println()
时,问题就出现了,在子代码中它也在写入标准输出。父进程也尝试反序列化
System.out.println()
,然后父进程中将出现异常

课程详情如下

public class DTO implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;

    public DTO()
    {
        this.name = "name";
    }

    public String getName() {
        return name;
    }

@Override
    public int hashCode() {}

@Override
public boolean equals(Object obj) {}
Parent.java

public class Parent {

  public static void main(String[] args) {

      try {
          new Parent().start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

      public void start() throws IOException, InterruptedException, ClassNotFoundException
      {
            String classpath = System.getProperty("java.class.path");
            String className = Child.class.getCanonicalName();

            ProcessBuilder builder = new ProcessBuilder(
                "java", "-cp", classpath, className);

            Process process = builder.start();

            if (process.isAlive()) {

                ObjectInputStream input = new ObjectInputStream(process.getInputStream());
                DTO dto = (DTO)input.readObject();

            }
      }
}
Child.java

public class Child {

    public static void main(String[] args) throws IOException {
        DTO dto = new DTO();

        System.out.println("printing random text here");

        ObjectOutputStream stream = new ObjectOutputStream(System.out);
        stream.writeObject(dto);
        stream.flush();
        stream.close();
    }
}
例外情况

java.io.StreamCorruptedException: invalid stream header: 64617364
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at working.Parent.start(Parent.java:35)
    at working.Parent.main(Parent.java:14)
java.io.StreamCorruptedException:无效的流头:64617364
位于java.io.ObjectInputStream.readStreamHeader(未知源)
位于java.io.ObjectInputStream。(未知源)
在working.Parent.start(Parent.java:35)
在working.Parent.main(Parent.java:14)

请注意,如果我们删除child.java中使用的
System.out.println()
,程序将无错误地执行。我认为这是因为序列化和sysout都在写入标准输出,所以父级认为它可以将两者反序列化。任何修复此问题的建议或其他类型的解决方法都将非常感谢

您通过直接向流写入字符串破坏了流。因此,您得到了一个
StreamCorruptedException
。这并不奇怪。你不能那样做。不能反序列化还包含随机插值的
System.out.println()
s的对象流。这应该是显而易见的

有没有解决这个问题的建议

对。不要这样做

或其他方法

替代方法是什么

您只需决定使用的是什么
System.out
。它要么是对象输出流,要么用于将文本打印到。不是两个都在同一时间

注意,您还没有像我告诉您的那样输入任何代码来读取错误流。如果不进行错误检查,就无法部署代码