使用 Scanner 从文件中读取 int 时获取 InputMismatchException

Getting InputMismatchException when reading an int from a file with Scanner

我正在开发一个从生成的文件中导入库的程序。 该文件正确生成并被扫描仪找到。第一行有一个 int,由

编写
    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();
            }
        }
    }

尝试使用

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

否则任何前导或尾随空格都会导致该错误。

我得到了一个工作示例:

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();
}

重点是在使用的分隔符中添加新行