2017-02-01 73 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; 

    } 

编辑:

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

你确认的书面文件的格式? InputMismatchException指示您尝试读取的令牌不能被解释为整数。 –

+0

'in.close()'*里面的*循环会在您通过当前障碍时立即杀死您的程序。建议您改用try-with-resources。 – Andreas

+0

显示输入文件的例子,所以我们可以更好地告诉你为什么'#'不是包含行结束符的文件的好分隔符。例如。如果第一行是数字,例如'42',并且第二行是'#'分隔的,例如, '1#标题#艺术家#标签#流派#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 * Artist 2 \ s *#\ s * | \ s * \ * * \ s * | \ 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 * \ s * POP \ s *#\ s * | \ s * \ s * 1 \ s *#\ s * | \ s * \ s * ' –

+0

我这样做了,现在一切正常。感谢您的时间和宝贵意见! –

0

尝试使用

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

否则任何开头或结尾空格将导致错误。

+0

不太可能解决这个问题,因为输入的行似乎没有被'#'分开。当然,没有看到实际的输入,不确定输入是什么。 – Andreas

+0

不幸的是,这并没有解决我的问题。 –