Nano Hash - криптовалюты, майнинг, программирование

Отсутствует строка при чтении с помощью средства чтения входного потока

У меня есть образец EXE, который печатает ниже вывода.

Вывод EXE:

1
2
3
4
5
Failed

эквивалентный код в Java:

for (int i = 1; i <= 5; i++){
     System.out.println(i);
}
System.out.println("Failed");

При попытке инициировать EXE с помощью кода Java и прочитать вывод некоторые данные пропадают.

Найдите java для запуска актива.

Код Java:

String[] commands = new String[] {"sample.exe" };
p = Runtime.getRuntime().exec(commands);
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while  ((line = br.readLine()) != null) {
    line = br.readLine()
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

Вывод:

1
3
5

Из приведенного выше вывода видно, что нам не хватает таких данных, как 2,3,5,failed.

Я думаю, что актив будет завершен до того, как мы прочитаем с помощью InputStreamReader. Можем ли мы каким-либо образом заставить актив ждать, пока мы прочитаем с помощью InputStreamReader и начнем следующий набор инструкций, или есть ли другой более лучший способ сделать это.

Редактировать1:

В моем исходном коде я также параллельно читаю поток ошибок, пожалуйста, найдите код.

ErrorStreamReader:

public void run () {
    try {

        InputStreamReader isr = new InputStreamReader (is);
        BufferedReader br = new BufferedReader (isr); 
        while (true) {
                String s = br.readLine ();
                System.out.println(s+"error Stream");
                if (s == null) break;
            }

    is.close ();    
    } catch (Exception ex) {
        System.out.println ("Problem reading stream " + name + "... :" + ex);
        ex.printStackTrace ();
    }
}

Java-код исполнителя EXE:

String[] commands = new String[] {"sample.exe" };
p = Runtime.getRuntime().exec(commands);
Thread errorStream = new Thread(new ReadStream("stderr", 
    p.getErrorStream ()) # Reads error Stream In parallel
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while  ((line = br.readLine()) != null) {
    line = br.readLine()
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

Похоже, что считыватель входного потока читает, пропуская по одной строке за раз.

EDIT2:

Поскольку я думал, что в InputStreamReader отсутствуют четные числовые строки, я внес изменение в EXE (скрипт python) для печати с 1 на 6, а затем потерпел неудачу.

Измененный вывод EXE:

1
2
3
4
5
6
Failed

Теперь вывод InputStreamReader был

Вывод Java:

1
3
5
Failed

Как я думал, мне не хватает строк с нечетными номерами. Может кто-нибудь, пожалуйста, дайте мне знать причину?


Примечание.

Проблема возникла из-за чтения inputStream Twice, извините за причиненные неудобства. Мне очень жаль.

17.11.2016

  • кажется, вы смотрите в неправильном направлении. Код выглядит нормально и должен работать для того, что вы описали. Sample.exe будет возвращаться таким образом ... что вы видите. 17.11.2016
  • Похоже, ваш исполняемый файл печатает только 1 и 4. 17.11.2016
  • Это может быть полезно javaworld.com/article/2071275/core-java/ 17.11.2016
  • @ f1sh, когда я запускал exe через командную строку, он печатал 1,2,3,4,5,failed, а не только 1 и 4 17.11.2016
  • @mtk Я тебя не понял. Не могли бы вы уточнить, что вы говорите. Спасибо 17.11.2016
  • Может быть, ваш exe печатает 2,3,5 и Failed в потоке ошибок, а не в стандартном потоке вывода? (Попробуйте p.getErrorStream() вместо p.getInputStream()). Кроме того, если последнее сообщение, которое является Failed, НЕ завершено с помощью CR/LF вашим exe, br.readLine() может не вернуть его, если поток не закрыт. 17.11.2016
  • @ThomasPhilipp образец exe печатает все в стандартном потоке вывода, но «сбой» не завершается с помощью CR / LF. Могу ли я узнать причину, по которой он должен быть прекращен с помощью CR / LF? 17.11.2016
  • @The6TheSense: если поток не закрыт, BufferedReader не может решить, действительно ли строка находится в конце, если нет CFLF. Таким образом, BuffereReader будет ждать либо появления дополнительных символов в потоке, либо закрытия потока. 18.11.2016
  • @ThomasPhilipp поток закрыт. Я внес небольшое изменение в EXE и нашел еще одну вещь. Пожалуйста, посмотрите в редактировании 21.11.2016
  • Предоставьте также код простого скрипта Python, с помощью которого можно воспроизвести проблемы. 21.11.2016
  • @NicolasFilotto Я обнаружил, что проблема связана с двойным чтением строки внутри фактического кода. Приносим извинения за доставленные неудобства. 21.11.2016
  • @The6thSense Может быть, вы могли бы сами добавить ответ и принять его, это покажет всем, что вопрос закрыт. 23.11.2016
  • @The6thSense Может быть, вы могли бы опубликовать настоящий код, содержащий ошибку, а затем опубликовать исправленный код в качестве ответа? 23.11.2016
  • Спасибо, ребята, сделаю то же самое. 23.11.2016

Ответы:


1

Проблема была из-за двойного чтения inputStream

while  ((line = br.readLine()) != null) {
    line = br.readLine() # input stream read here twice
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

Отсюда и проблема. Чтобы решить эту проблему, я читаю inputStream только один раз.

while  ((line = br.readLine()) != null) {
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}
23.11.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..