【问题标题】:Need to read String and Double from file [duplicate]需要从文件中读取 String 和 Double [重复]
【发布时间】:2016-08-25 08:20:38
【问题描述】:

我在尝试从 txt 文件中读取 String 和 Double 时遇到了一些问题。 这是我的txt文件:

Mike 300.50
John 260
Lisa 425.33

这是我用来阅读它们的代码:

reader = new Scanner();
while(reader.hasNext()){
    name= reader.next();
    salary = reader.nextDouble();
    System.out.println(name + " " + salary + "\r\n");
}

每当我运行此代码时,Exception in thread "main" java.util.InputMismatchException 就会出现,告诉我问题出在nextDouble()

有人知道怎么解决吗?

【问题讨论】:

  • nextDouble() 离开换行符,因此您对next() 的第二次调用会使用换行符,然后您尝试将下一个名称解析为双精度。我建议你一次读一整行。
  • 这样做我将无法将这两个东西保存在不同的属性中。或者我可以吗?

标签: java string double java.util.scanner


【解决方案1】:
reader = new Scanner();
while(reader.hasNext()){
    name= reader.next();       
    salary = reader.nextDouble();
    System.out.println(name + " " + salary + "\r\n");
    reader.nextLine();
}

试试这个。发生的事情是扫描仪在每次加倍之后读取空行,所以 name 将是空行,它会读取(例如)John 作为薪水,并给你那个例外。 所以我所做的就是添加那一小行代码:reader.nextLine();,这样它就可以跳过那个空行。希望这可以帮助。

【讨论】:

    【解决方案2】:

    你可以试试这个方法:

    while(reader.hasNextLine()){
        String[] values = reader.nextLine().split("\\s+");
        name= values[0];
        salary = Double.valueOf(values[1]);
        System.out.println(name + " " + salary + "\r\n");
    }
    

    【讨论】:

    • 抱歉打扰了,但是这些行是做什么的?谢谢。
    • 我想知道这些行的作用:name= values[0];工资 = Double.valueOf(values[1]);
    • reader.nextLine().split("\\s+"); 按空格一次分割一行并将其存储在字符串数组中。所以我通过values[0] 数组的第一个元素和Double.valueOf(values[1]) 将第二个元素解析为双精度来获取字符串名称
    • 非常感谢!它工作得很好,现在我理解了一些新概念:)
    • @Tom 欢迎并很高兴知道它对您有所帮助
    【解决方案3】:

    您可以使用 java.io.StreamTokenizer 来读取 String 和 double。 StreamTokenizer 将文件拆分为具有合适数据类型的标记。 并且通过使用一些常量,您可以识别令牌类型。 比如 TT_NUMBER,TT_WORD

    File f=new File("path of file");
    StreamTokenizer st=new StreamTokenizer(new FileInputStream(file));
    while(st.nextToken()!=StreamTokenizer.TT_EOF)   //getting contents of file{
        switch(st.ttype)
        {
            case StreamTokenizer.TT_EOF: break;
            case StreamTokenizer.TT_NUMBER://it will read number always in double data type
                no=st.nval;
            break;
            case StreamTokenizer.TT_WORD:
                name=st.nval;
            break;
        }}
    

    【讨论】:

    • 为什么这被否决了?
    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 2016-05-04
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2018-07-30
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多