我有我的第一个小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程序内部发生的情况以及发生错误的位置。
答案 0 :(得分:1)
PrintWriter类默认为缓冲。只有在缓冲区中有足够的数据时,它才会真正写入文件,以减少操作系统开销。这就是为什么您看不到文件中的任何内容的原因-数据一直保存到内存中,直到缓冲区已满。
如果希望数据立即在文件中结束,则可以在要写入文件时调用PrintWriter上的flush
方法。或者在构造它时,可以将true
作为第二个参数进行传递,以使其自动冲洗。这样,它将在每次打印后刷新。
但是,没有构造函数带有String和autoFlush标志,因此您需要编写:
PrintWriter pw = new PrintWriter(new FileOutputStream("status.txt"), true);
(请注意,像在原始代码中那样将PrintWriter包装在PrintWriter中是没有意义的。)