Почему мой PipedInputStream не получает никаких данных, предоставленных ему через PipedOutputStream? - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно обмениваться данными между двумя классами, используя каналы и / или вилки . У меня есть три класса, где класс верхнего уровня начинает выполнение процесса (Front класс). Класс Front принимает строку ввода от пользователя и пытается передать ее в класс Back, Front также начинает новый процесс, выполняя Back.

Я пытался передать строковое значение из одного класса в другой, используя PipedInputStream и PipedOutputStream . По какой-то причине я не получаю никаких данных в классе Back, и процесс также не завершается. Не следует ли привести программу обратно в класс Front после завершения выполнения в классе Back? Кажется, он еще не завершен, но выполнение достигает класса Back. Я добавил print операторов, и кажется, что класс Back работает неправильно после inputStream.read().

Коды для Front и Back классов, которые я включил ниже:

Фронт -

private static int exec(Class Back, List<String> jvmArgs, List <String> args) throws IOException, InterruptedException {
        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        String className = Back.getName();

        List<String> command = new ArrayList<>();
        command.add(javaBin);
        command.addAll(jvmArgs);
        command.add("-cp");
        command.add(classpath);
        command.add(className);
        command.addAll(args);

        ProcessBuilder builder = new ProcessBuilder(command);
        Process process = builder.inheritIO().start();
        process.waitFor();
        return process.exitValue();

    }

    public static PipedOutputStream out= new PipedOutputStream();
    public static PipedInputStream input = new PipedInputStream();
    public static void main(String[] args) throws IOException, InterruptedException {

        Front front = new Front();
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter Name: ");
        front.setName(sc.nextLine());
        out.connect(input);
        Thread thread1 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    out.write(name.getBytes());
                } catch (IOException e) {
                    e.getMessage();
                }               
            }
        });

        System.out.println("Beginning thread execution");
        Front.exec(Back.class, new ArrayList<String>(), new ArrayList<String>());
        System.out.println("Ending thread execution");
        thread1.start();
        sc.close();
    }

Назад -

public static void main(String[] args) throws IOException {

        System.out.println("We are in \"Back\" now");
        Front.input.connect(Front.out);

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int data = 0;
                    data = Front.input.read();
                    System.out.println("Why MAAN, Why?");
                    while (data != (-1)) {
                        System.out.println((char)data);
                        data = Front.input.read();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        thread2.start();
        Front.input.close();
    }

Я ожидаю, что классы будут обмениваться данными, используя потоковые потоки, то есть от Front до Back и снова от Back до Front, но я не могу получитьлюбое значение в моем Back классе. Я не уверен в коде, который я написал, но не знаю, как написать его лучше. Где я неправ? Как я могу добиться работы, которая мне нужна. Спасибо, что нашли время, чтобы прочитать до конца. Ты жжешь! ^ _ ^

РЕДАКТИРОВАТЬ: Я пытался реализовать его по-новому с потоками, но теперь я получаю IOException высказывание Pipe closed. Я попытался удалить оператор Front.input.close(), но затем выполнение программы переходит в своего рода бесконечно работающее состояние без предоставления какого-либо вывода или возврата управления программой в родительский поток Front.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...