2016-10-14 2 views
-1

Привет, поэтому я пытаюсь использовать этот код для чтения из текстового файла, текстовый файл должен определять шаг, проверяя, будет ли строка следующей строки начинаться с остановки , играть или длительность, а затем передавать его на синтезатор, чтобы он мог играть.java.util.InputMismatchException При загрузке из файла

Кто-нибудь есть идеи, почему он вызывает ошибки и не работает?

код и пример текстового файла следующим образом:

 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

Если вы получаете исключение и спрашиваете об этом, вам нужно опубликовать весь стек с вашим вопросом. Он содержит важную информацию. Также укажите, какая строка его выбрасывает. –

+0

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

+0

........... привет? –

ответ

1

Ваша проблема связана с использованием два сканера в том же файле. Вы предполагаете, что когда один сканер читает токен, оба продвигают свои указатели, и это не то, что происходит - только сканер, который читает токен, продвигается, и по этой причине вы пытаетесь прочитать int, когда сканер указывает на текст. Не делайте этого, используйте только один сканер.

Сказав это, вы можете использовать более одного сканера, но только один из них читает файл, и это то, что я часто делаю: один сканер читает файл, получая каждую строку строки через nextLine(), а другой Для каждой строки текста создается сканер для извлечения маркеров, найденных в строке. Когда я это делаю, я позабочусь о том, чтобы закрыть каждую строку «Сканер», когда она закончилась, и, конечно же, закрыть файл «Сканер файлов», когда он полностью завершен.