如何知道我的Java程序在做什么?

时间:2019-06-25 21:56:15

标签: java debugging jar compilation speech-to-text

我有我的第一个小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 个答案:

答案 0 :(得分:1)

PrintWriter类默认为缓冲。只有在缓冲区中有足够的数据时,它才会真正写入文件,以减少操作系统开销。这就是为什么您看不到文件中的任何内容的原因-数据一直保存到内存中,直到缓冲区已满。

如果希望数据立即在文件中结束,则可以在要写入文件时调用PrintWriter上的flush方法。或者在构造它时,可以将true作为第二个参数进行传递,以使其自动冲洗。这样,它将在每次打印后刷新。

但是,没有构造函数带有String和autoFlush标志,因此您需要编写:

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

(请注意,像在原始代码中那样将PrintWriter包装在PrintWriter中是没有意义的。)