Как мне сказать, что делает моя Java-программа? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть моя первая маленькая программа на Java:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;

import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.SpeechResult;
import edu.cmu.sphinx.api.LiveSpeechRecognizer;

public class Sphinx {
    public static void main(String[] args) throws Exception {

        Configuration configuration = new Configuration();

        configuration.setAcousticModelPath("models/en-us/en-us");
        configuration.setDictionaryPath("models/en-us/cmudict-en-us.dict");
        configuration.setLanguageModelPath("models/en-us/en-us.lm.bin");

        PrintWriter pw = new PrintWriter(new PrintWriter("status.txt"));
        LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration);
        recognizer.startRecognition(true);
        pw.print("running");
        Thread.sleep(5000);
        SpeechResult result = recognizer.getResult();
        recognizer.stopRecognition();
        pw.print("stopped");
        pw.close();

        PrintWriter pw2 = new PrintWriter(new PrintWriter("result.txt"));
        pw2.println(result);
        pw2.close();
    }
}

И, как вы можете сказать, это исполняемый файл, который управляет механизмом преобразования речи в текст, созданный CMU.

Он выводит свой статус и результаты речи в текст в два разных текстовых файла.

Теперь раздражает то, что я абсолютно не представляю, что моя программа вообще что-то делает или нет. Я дважды щелкаю на .jar, что-то говорю в свой микрофон, но ни один из текстовых файлов не меняется или вообще ничего не делает.

Я запустил программу через компилятор, и он говорит, что все в порядке. Но это явно не так, и я не могу сказать, где проблема.

Итак, мне нужно знать методы, чтобы рассказать, что происходит внутри моей Java-программы и где происходят ошибки.

1 Ответ

1 голос
/ 26 июня 2019

Класс PrintWriter по умолчанию буферизован . Он будет действительно записывать в файл только тогда, когда в буфере будет достаточно данных, чтобы уменьшить нагрузку на операционную систему. Вот почему вы ничего не видите в файле - данные сохраняются в памяти до тех пор, пока буфер не будет заполнен.

Если вы хотите, чтобы данные сразу попадали в файл, вы можете вызвать метод flush на PrintWriter, когда хотите записать в файл; или когда вы его создаете, вы можете передать true в качестве второго аргумента, чтобы auto-flushing . Таким образом, он будет сбрасываться после каждой печати.

Однако не существует конструктора, который принимает String и флаг autoFlush, поэтому вам нужно написать:

PrintWriter pw = new PrintWriter(new FileOutputStream("status.txt"), true);

(Обратите внимание, что нет смысла заключать PrintWriter в PrintWriter, как вы делаете это в своем исходном коде).

...