Java:使用流来读取文件的问题

时间:2017-07-08 08:22:56

标签: java file split path stream

使用之前向我建议的内容,我尝试使用Path和stream以下列方式读取文件:

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

每一行在开头都包含一个与我想要创建的对象相对应的字母(&#34; Editore&#34;或者&#34; Libro&#34;)以及以下字段包含的值其属性(所有字段由半列分隔)。但是,在执行时,我会收到以下异常和错误:

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:

enter image description here

先谢谢你的帮助, 詹卢卡。

2 个答案:

答案 0 :(得分:1)

我认为你在第一部分做了一点误会。 E.g。

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

注意你是如何跳过索引&#39; 0&#39; (在if语句中)索引&#39; 2&#39; (在&#34; creaEditore&#34;的第一个参数中)。如果它不会在&#34; parseInt&#34;中抱怨错误的参数。方法,这将抛出IndexOutOfBoundException,因为数组索引从0开始而不是1。

答案 1 :(得分:0)

如果您的案例是E,则您的代码正在关注

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

您正在尝试将 lineAsArray [3]的值转换为Int 。 在这种情况下,索引3处的值为“ cheih@gja.it ”,无法转换为int。这就是你得到这个例外的原因