您好我正在尝试使用此代码从文本文件中读取,文本文件应该通过检查下一行的字符串是以停止,播放还是持续时间开始,然后传递它来定义音高合成所以它可以发挥。
有没有人知道为什么它会导致错误并且无法正常工作?
代码和示例文本文件如下:
public class MyTuneRunnable implements Runnable {
//method start
public void run(){
Thread thread = Thread.currentThread();
thread.getName();
try {
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
MidiChannel[] channels = synth.getChannels();
File file = new File(Loader.instance().getConfigDir().getParentFile().getAbsolutePath()+"/"+"LoadTunes"+"/"+Config.tuneName+".txt");
try {
Scanner intLoader = new Scanner(file);
Scanner stringLoader = new Scanner(file);
while (intLoader.hasNextLine()&stringLoader.hasNextLine()) {
int i = intLoader.nextInt();
String s = stringLoader.next();
if (s.startsWith("play")){
channels[channel].noteOn( i, volume);
}
if (s.startsWith("stop")){
channels[channel].noteOff( i, volume);
}
if (s.startsWith("duration")){
Thread.sleep(i);
}
}
intLoader.close();
stringLoader.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
synth.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
关于文本文件的外观......这是一个例子:
0 This is a comment
0
play 60 This is a C note and it is set to play because of 'play <note number>'
0
duration 200 This is saying the currently playing notes will make sound
0
stop 60 This stops playing the C note because of the 'stop <note number>'
答案 0 :(得分:1)
您的问题源于在同一文件中使用两个扫描程序。你假设当一个扫描仪读取一个令牌时,它们都会推进它们的指针,而这不会发生 - 只有读取令牌的扫描仪才会前进,因此,你试图读取一个令牌。当扫描仪指向文本时为int。不要这样做,只使用一台扫描仪。
话虽如此,您可以使用多个扫描程序,但只有其中一个读取文件,这是我经常做的事情:一个扫描程序读取文件,通过nextLine()
获取每一行字符串,为每行文本创建另一个扫描程序,以提取行中找到的标记。当我这样做时,我会小心地关闭每一行扫描仪,当然完成它后关闭文件扫描仪。