processBuilder pusty inputStream

0

Piszę program który testuje działanie innego programu, w tym wypadku napisanego w c.
Robię to przekazując mu jako wejście plik testowy zawierający 1<x<10^6 liczb, następnie odczytuję wyjście i porównuję z oczekiwanym wynikiem.
Niestety jeśli test zawiera >10 liczb odczyt z wyjścia jest pusty, co robię źle?

	@Override
	public Integer call() throws Exception {
		ProcessBuilder pb = new ProcessBuilder(progPath);

		pb.redirectInput(new File(testPath.toString()));
		pb.redirectErrorStream(true);

		Process proc = pb.start();

		InputStream in = proc.getInputStream();

		String output = readOutput(in);
		proc.waitFor();

		String answer = Files.lines(answerPath).collect(Collectors.joining(" "));
		if (output.trim().equalsIgnoreCase(answer.trim())) {
			System.out.println("OK: \"" + testPath.toString());
			return 0;
		} else {
			System.out.println("WA: \"" + testPath.toString() + "\" \n" + output.trim() + "\n" + answer.trim());
			return 1;
		}
	}

	private String readOutput(InputStream is) {
		Scanner s = new Scanner(is);
		String str = "";

		while (s.hasNext()) {
			str += s.next() + " ";
		}
		s.close();

		return str;
	}
1

Masz tu rodzaj wyścigu. Próbujesz czytać dane, gdy te jeszcze nie są gotowe. Zrealizowanie tego w powietrzu jest skomplikowane, wymaga jakiejś wielowątkowości. Lepiej niech badany program zapisze wynik do pliku, zamknie go i wtedy dopiero czytaj go w Javie. To zrobisz łatwo, a efekt końcowy ten sam.

0

Po zmianach dostaję output z większej ilości testów, jednak wciąż są takie dla których odpowiedź jest pusta.

	@Override
	public Integer call() throws Exception {
		File f = File.createTempFile(testPath.getFileName().toString(), "tmp");
		ProcessBuilder pb = new ProcessBuilder(progPath);

		pb.redirectInput(new File(testPath.toString()));
		pb.redirectOutput(f);
		pb.redirectErrorStream(true);

		Process proc = pb.start();

		proc.waitFor();
		String output = Files.lines(Paths.get(f.getAbsolutePath())).collect(Collectors.joining(" "));
		String answer = Files.lines(answerPath).collect(Collectors.joining(" "));

		f.deleteOnExit();
		if (output.trim().equalsIgnoreCase(answer.trim())) {
			System.out.println("OK: \"" + testPath.toString());
			return 0;
		} else {
			System.out.println("WA: \"" + testPath.toString() + "\" \n" + output.trim() + "\n" + answer.trim());
			return 1;
		}
	}

Edit

To już nie wina javy tylko błędu w programie w c.

1 użytkowników online, w tym zalogowanych: 0, gości: 1