Проблема запуска внешней программы из JAR-файла

Модератор: Модераторы разделов

Ответить
erslgoeirjh
Сообщения: 1

Проблема запуска внешней программы из JAR-файла

Сообщение erslgoeirjh »

Сам работаю под Windows. Написал на Java программу, откомпилировал и образовал JAR-файлы test1.jar, consoleapp.jar, consoleapp2.jar . При этом программа test1 вызывает программы consoleapp или consoleapp2. Программа consoleapp просто выводит информацию ан экран в консольном режиме, а программа consoleapp2 сначала осуществляет ввод информации в консольном режиме, а потом осуществляет вывод введённой информации на экран в консольном режиме.

Перебросил их по протоколу FTP на Unix-сервер (оболочка--Korn Shell). Со своего компьютера потом через эмулятор exceed пытаюсь запускать test1, в случае, когда он запускает consoleapp. Там всё нормально, информация выводится без проблем.
А вот если из программы test1 запустить consoleapp2, то сперва происходит ввод всех значений, а потом вывод их на экран, хотя должно сначала вводиться первое значение, потому выводиться это значение на экран, затем вводиться второе значение, потом выводиться на экран и т.д.

В чём причина этого?

Файл test1.java и файлы StreamGobbler1.java и StreamGobbler2.java, которые входят в проект test1:

test1.java:

Код: Выделить всё

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.nio.*;
import java.lang.*;
import java.util.*;
import java.text.*;

public class test1 {

    private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="10,10"

    private JPanel jContentPane = null;

    private JButton jButton = null;

    public boolean canInput = true;

    public boolean canOutput = true;

    /**
     * This method initializes jButton
     *
     * @return javax.swing.JButton
     */
    private JButton getJButton() {
        if (jButton == null) {
            jButton = new JButton();
            jButton.setBounds(new Rectangle(31, 31, 164, 29));
            jButton.setText("Запустить программу");
            jButton.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent e) {
                    //System.out.println("mouseClicked()"); // TODO Auto-generated Event stub mouseClicked()
                    boolean  flag = true;
                    byte b[] = new byte[80];

                    System.out.println("Перед блоком try");
                    try {
                        Process proc = Runtime.getRuntime().exec("java -jar consoleapp.jar");
                        /* InputStreamReader  isr = new InputStreamReader(proc.getInputStream());
                        BufferedReader br = new BufferedReader(isr);
                        String line=null;
                        line = br.readLine();
                        line = line + "\n";
                        b = line.getBytes();
                        System.out.write(b, 0, b.length);
                        br.close(); */
                        //Thread.sleep(1000);
                        StreamGobbler1  errorGobbler = new StreamGobbler1(proc.getErrorStream(), "ERROR", proc);
                        errorGobbler.t1 = test1.this;
                        errorGobbler.start();
                        System.out.println("после ERROR");
                        StreamGobbler1  outputGobbler = new StreamGobbler1(proc.getInputStream(), "OUTPUT", proc);
                        outputGobbler.t1 = test1.this;
                        outputGobbler.start();
                        System.out.println("после OUTPUT");
                        StreamGobbler2  inputGobbler = new StreamGobbler2(proc.getOutputStream(), "INPUT", proc);
                        inputGobbler.t1 = test1.this;
                        //Thread.sleep(1000);
                        inputGobbler.start();
                        System.out.println("после INPUT");
                        System.out.println("после inputGobbler.start()");
                        int exitVal = proc.waitFor();
                        System.out.println("после proc.waitFor()");
                        System.out.print("Значение exitVal: ");
                        System.out.println(exitVal);
                    } catch (Exception ex) {
                        System.out.print("Ошибка: ");
                        System.out.println(ex.toString());
                        flag = false;
                    }
                    if (flag==true)  System.out.println("после блока try--catch");
                }
            });
        }
        return jButton;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                test1 application = new test1();
                application.getJFrame().setVisible(true);
            }
        });
    }

    /**
     * This method initializes jFrame
     *
     * @return javax.swing.JFrame
     */
    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setSize(241, 135);
            jFrame.setContentPane(getJContentPane());
            jFrame.setTitle("Application");
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Dimension frameSize = jFrame.getSize();
            if (frameSize.height > screenSize.height) {
                frameSize.height = screenSize.height;
            }
            if (frameSize.width > screenSize.width) {
                frameSize.width = screenSize.width;
            }
            jFrame.setLocation((screenSize.width - frameSize.width) / 2,
                    (screenSize.height - frameSize.height) / 2);
        }
        return jFrame;
    }

    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getJButton(), null);
        }
        return jContentPane;
    }

}


StreamGobbler1.java:

Код: Выделить всё

import java.lang.*;
import java.util.*;
import java.text.*;
import java.io.*;
import java.nio.*;

public class StreamGobbler1 extends Thread {
    InputStream  is;
    String  type;

    StreamGobbler1 (InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    public void run() {
        try {
            InputStreamReader  isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ((line=br.readLine())!=null)  System.out.println(type + ">" + line);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}


Файл StreamGobbler2.java:

Код: Выделить всё

import java.lang.*;
import java.util.*;
import java.text.*;
import java.io.*;
import java.nio.*;

public class StreamGobbler2 extends Thread {
    OutputStream  os;
    String  type;

    StreamGobbler2 (OutputStream os, String type) {
        this.os = os;
        this.type = type;
    }

    public void run() {
        try {
            /* InputStreamReader  isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ((line=br.readLine())!=null)  System.out.println(type + ">" + line); */
            OutputStreamWriter  osr = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osr);
            byte b[] = new byte[80];
            while (System.in.read(b, 0, 80)!=-1) {
                String s = new String(b);
                s = type + ">" + s;
                bw.write(s);
                bw.newLine();
            }
            System.in.read(b, 0, 80);

        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}


Файл consoleapp.java:

Код: Выделить всё

public class ConsoleApp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("первая строка");
        System.out.println("вторая строка");
        System.out.println("третья строка");
        System.out.println("четвёртая строка");
    }

}


Файл consoleapp2.java:

Код: Выделить всё

public class ConsoleApp2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int i;
        byte b[] = new byte[80];

        try {
            System.out.println("Введите четыре строки:");
            for (i=0; i<4; i++) {
                System.in.read(b, 0, b.length);
                String s = new String(b);
                System.out.println(s);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}


То в случае, если в файле test1.java стоит

Код: Выделить всё

Process proc = Runtime.getRuntime().exec("java -jar consoleapp.jar");


то тогда на экран терминального окна благополучно выводятся:

Код: Выделить всё

первая строка
вторая строка
третья строка
четвёртая строка


а если в файле test1.java стоит

Код: Выделить всё

Process proc = Runtime.getRuntime().exec("java -jar consoleapp2.jar");


то после перекомпиляции, пересоздания файла test1.jar и переброски его на этот Unix-сервер на экране появляется

Код: Выделить всё

Введите четыре строки:


после этого оператор вводит строку (например, 1). Но после этого 1 не выводится на экран, а происходит ожидание ввода следующей строки. После того, как оператор ввёл её (например, 2), то вместо вывода 2 следует ожидание следующей строки.
И только после того, как оператор последовательно ввёл четыре строки (например, 1, 2, 3, 4), на экран выводятся эти четыре строки:



А далее выводится вся та информация, которая должна выводиться в программе test1.jar после запуска из неё программы consoleapp2 .

В чём причина этого? Почему не работает последовательный ввод и вывод информации в терминальном окне?
Спасибо сказали:
Аватара пользователя
Encore
Сообщения: 656
Статус: loading..............
ОС: Debian

Re: Проблема запуска внешней программы из JAR-файла

Сообщение Encore »

Какая ОС стоит на вашем "Unix-сервере"? какая версия java?

InputStream
read
This method blocks until input data is available, end of file is detected, or an exception is thrown

Попробуйте явно задать EOF после ввода, нажимая вместо Enter - Ctrl+D

чтение в массив byte[80] обязательно? можно попробовать readLine из BufferedReader.

P.S. Для экспериментов, достаточно не пересобирать все в jar, а работать только с ConsoleApp2.java
javac ConsoleApp2.java
java ConsoleApp2
Спасибо сказали:
Ответить