【问题标题】:Java: problems using stream to read a fileJava:使用流读取文件的问题
【发布时间】:2017-07-08 08:22:55
【问题描述】:

使用之前在这里向我建议的内容,我正在尝试通过以下方式使用 Path 和流读取文件:

Path p= Paths.get(file);
        try (Stream<String> lines = Files.lines(p, StandardCharsets.UTF_8)) { // 1
            lines.map(line -> line.split(";"))                          // 2
                 .forEach(lineAsArray -> {
                     if (lineAsArray[0].equals("E")) {
                         creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
                     }
                     else if (lineAsArray[0].equals("L")) {
                        Libro tmp = null;
                        try {
                            tmp = creaLibro(lineAsArray[1], lineAsArray[2], Integer.parseInt(lineAsArray[3]), Double.parseDouble(lineAsArray[4]), lineAsArray[5]);
                        } catch (NumberFormatException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (EditoreInesistente e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        tmp.setQuantita(Integer.parseInt(lineAsArray[6]));
                     }
                 });
        }
        catch (IOException io)
        {
            System.out.println("Wrong reading");
        }

每一行的开头包含一个字母,对应于我要创建的对象(“Editore”或“Libro”),以下字段包含其属性的值(所有字段由半-柱子)。但是,在执行时,出现以下异常和错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "cheih@gja.it"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at libreria.Libreria.lambda$4(Libreria.java:122)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.Iterator.forEachRemaining(Unknown Source)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.forEach(Unknown Source)
    at libreria.Libreria.leggi(Libreria.java:120)
    at Esempio.main(Esempio.java:20)

调试我发现在读取第一行时一切正常,但是程序无法解析它并使用 lineAsArray[] 获取每个字段。有人能帮我吗?程序的要求还要求不要考虑sintax不正确的行,我的代码会自动执行类似的操作吗?

这是我的文件的sintax:

提前感谢您的帮助, 詹卢卡。

【问题讨论】:

  • 你确定索引,你不是说creaEditore(lineAsArray[1], Integer.parseInt(lineAsArray[2]), lineAsArray[3]);吗?

标签: java file split path stream


【解决方案1】:

我认为你在第一部分犯了一个小错误。例如

if (lineAsArray[0].equals("E")) {
creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
}

注意您是如何从索引“0”(在 if 语句中)跳转到索引“2”(在“creaEditore”的第一个参数中)。如果它不会抱怨“parseInt”方法中的错误参数,这将引发 IndexOutOfBoundException,因为数组索引从 0 而不是 1 开始。

【讨论】:

    【解决方案2】:

    当您的案例为 E 时,您的代码如下

    if (lineAsArray[0].equals("E")) {
       creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
       }
    

    您正试图将 lineAsArray[3] 的值转换为 Int。 在这种情况下,索引 3 处的值是“cheih@gja.it”,无法转换为 int。这就是您收到此异常的原因

    【讨论】:

    • 你拯救了我的一天,谢谢。有什么想法可以避免考虑使用不正确的语法的行吗?
    • 存储和检索数据的方式有很多种,好像要将数据保存在文件中就应该使用 JSON。它易于以 JSON 格式读取和存储数据。或者您可以使用数据库或者基于文件的数据库,例如大型项目的 H2 或 MySql
    • @Gianluca 没有涉及语法错误,请仔细检查您的代码!
    • 好的,但我仍然不明白如何忽略具有不正确语法的行,例如使用这种阅读方式以“X”开头的行。我认为它会自动丢弃它们,因为这种情况不是“if else if”语句之一,但我得到错误....
    • @Gianluca 您遇到了哪些错误? Sincd 你的陈述是正确的(前缀不正确的行被忽略),这意味着其他地方肯定有问题。但是没有错误/堆栈跟踪,它不可能指向正确的方向。
    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多