2017-02-01 25 views
1

私は、生成されたファイルからライブラリをインポートするプログラムを開発中です。 ファイルが正しく生成され、スキャナによって検出されます。最初の行には、次のような単一のintがあります。スキャナでファイルからintを読み取るときにInputMismatchExceptionが発生する

pw.println(cdarchive.getNumber()); 

コードのどこかにあります。この部分はうまくいくようです。

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:864) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextInt(Scanner.java:2117) 
    at java.util.Scanner.nextInt(Scanner.java:2076) 
    at no.hib.dat102.IO.readFile(IO.java:26) 
    at no.hib.dat102.Menu.start(Menu.java:34) 
    at no.hib.dat102.CdArchiveClient.main(CdArchiveClient.java:10) 

それはこれが私の方法である

int libSize = in.nextInt(); 

で指しライン:

public class IO { 

    static final String DELIMITER = "#"; 
    public static CdArchiveADT readFile(String filename) { 
     Scanner in = null; 
     CdArchiveADT cda = null; 
     try 
     { 
      File f = new File(filename+".txt"); 
      in = new Scanner(f); 
      System.out.println(f); 
      in.useDelimiter(DELIMITER); 
      int libSize = in.nextInt(); 
      System.out.println("libSize" + libSize); 
      cda = new CdArchive(libSize); 
      for (int i=0; i<libSize;i++) { 
       int inId = in.nextInt(); 
       String inTitle= in.next(); 
       String inArtist = in.next(); 
       String inLabel = in.next(); 
       String inGenre = in.next(); 
       int inYear = in.nextInt(); 
       in.nextLine(); 
       cda.addCd(new CD(inId, inArtist, inTitle, inYear, inGenre, inLabel)); 
       System.out.println("Closing Scanner (input)"); 
       in.close(); 

      } 
    } 
     catch (FileNotFoundException e){ 
      System.out.println("Config file not found!"); 
      e.printStackTrace(); 
     } 


     return cda; 

    } 

EDIT:

この

は私が取得していますエラーです
This is the method that writes to the file: 
    public static void writeFile(CdArchiveADT cdarchive, String filename) throws IOException {  
     PrintWriter pw = null; 
     File file = null; 

     try { 
      file = new File(filename +".txt"); 
      // Create the file if it does not already exist 
      file.createNewFile(); 

      // Writing metadata 
      pw = new PrintWriter(new FileWriter(file, false)); 
      pw.println(cdarchive.getNumber()); 
      // Writing data, if CdArchive is not empty 
      if (cdarchive.getCdTable()[0] != null) { 
      for (int i = 0; i<cdarchive.getNumber(); i++) { 
       CD c = cdarchive.getCdTable()[i]; 
       pw.print(c.getId()); pw.print(DELIMITER); 
       pw.print(c.getTitle()); pw.print(DELIMITER); 
       pw.print(c.getArtist()); pw.print(DELIMITER); 
       pw.print(c.getLabel()); pw.print(DELIMITER); 
       pw.print(c.getGenre()); pw.print(DELIMITER); 
       pw.print(c.getYear()); pw.println(DELIMITER); 
      } 
     } 
     } 
     catch (FileNotFoundException e) 
     { 
      System.out.println("File not found!"); 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (pw != null) 
      { 
       System.out.println("Closing PrintWriter"); 
       pw.close(); 
      } 
     } 
    } 
+0

aswell使用区切り文字に新しい行を追加することですか? InputMismatchExceptionは、読み取ろうとしているトークンを整数として解釈できないことを示します。 –

+0

これは、 'in.close()' *の中の*現在のハードルを乗り越えたらすぐに、ループがあなたのプログラムを終了させます。代わりにtry-with-resourcesを使用することをお勧めします。 – Andreas

+0

入力ファイルの例を示します。なぜなら、行終端文字を含むファイルの '# 'が良い区切り文字でない理由をよりよく分かりやすくするためです。例えば。第1の行が数字、例えば「42」であり、第2の行が「#」で区切られている場合、例えば。 '1#Title#Artist#Label#Genre#2017'の場合、最初の*トークンはテキスト' 42 \ r \ n1'です。これは間違いなく有効な数字です。 – Andreas

答えて

0

私は、実施例を得た:

public static void main(String[] args) { 

    // write 
    String delimiter = "#"; 
    StringWriter stringWriter = new StringWriter(); 
    PrintWriter pw = new PrintWriter(stringWriter); 
    pw.println(3); 
    for (int i = 0; i < 3; i++) { 
     pw.print("id " + i); 
     pw.print(delimiter); 
     pw.print("titel " + i); 
     pw.print(delimiter); 
     pw.print("artist " + i); 
     pw.println(delimiter); 
    } 

    String theString = stringWriter.toString(); 
    System.out.println(theString); 

    try { 
     pw.close(); 
     stringWriter.close(); 
    } catch (IOException e) { 
     // ignore in example 
    } 

    // read 
    Scanner in = new Scanner(theString); 
    in.useDelimiter("\\s*#\\s*|\\s*\n\\s*"); // add new line as delimiter aswell 
    int libSize = in.nextInt(); 
    for (int i = 0; i < libSize; i++) { 
     String inId = in.next(); 
     String inTitle = in.next(); 
     String inArtist = in.next(); 
     in.nextLine(); 

     System.out.println("read: " + inId + ", " + inTitle + ", " + inArtist); 
    } 
    in.close(); 
} 

ポイントは、あなたが書かれたファイルの形式を確認しました

+0

これは本当に機能しました!出力はそれほど美味しくありませんでした。'3 0 \ s *#\ s * | \ s * \ s *タイトル1 \ s *#\ s * | \ s * \ s *アーティスト1 \ s *#\ s * | \ s * \ s * 1 \ s *#\ s * | \ s * \ s * ROCK \ s *#\ s * | \ s * \ s * 1 \ s *#\ s * | \ s * \ s * 1 \ s *#\ s * | \ s * \ s *タイトル2 \ s *#\ s * | \ s * \ s *アーティスト2 \ s *#\ s * | \ s * \ s *ラベル2 \ s *#\ s * | \ s * \ s * ALTERNATIVE \ s *#\ s * | \ s * \ s * 2000 \ s *#\ s * | \ s * \ s * 2 \ s *#\ s * | \ s * \ s *タイトル3 \ s *#\ s * | \ s * \ s *アーティスト3 \ s *#\ s * | \ s * \ s *ラベル\ 3 * \ s * \ s * \ s * POP \ s *#\ s * \ s * \ s * 1 \ s *#\ s * | \ s * \ s * ' –

+0

これを実行して、すべてが完全に機能しています。あなたの時間と貴重なアドバイスをありがとう! –

0

それ以外の場合は任意の先頭または末尾にスペースがそのエラーの原因となります

static final String DELIMITER = "\\s*#\\s*"; 

を使用するようにしてください。

+0

入力行が '# 'で区切られていないように、問題を修正する可能性は低いです。もちろん、実際の入力が表示されない場合は、入力が何であるかは不明です。 – Andreas

+0

それは残念ながら私の問題を解決しませんでした。 –

関連する問題