2017-07-08 97 views
0

使用之前已经建议我在这里的问题,我尝试使用路径来读取一个文件,并以下列方式流:的Java:使用流读取文件

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: "[email protected]" 
    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

预先感谢您的帮助, 赞布罗塔。

+1

您确定关于索引,您是不是指'creaEditore(lineAsArray [ 1],Integer.parseInt(lineAsArray [2]),lineAsArray [3]);'? – ktul

回答

0

当你的情况是E,你的代码如下

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

而你试图lineAsArray [3]的值转换成诠释。 在这种情况下,索引3处的值是“[email protected]”,它不能转换为int。这就是为什么你会得到这个例外

+0

你救了我的一天,谢谢你。任何想法,以避免考虑与sintax不正确的行? – Gianluca

+1

存储和检索数据的方法很多,就好像要将数据保存在文件中一样,您应该使用JSON。它易于以JSON格式读取和存储数据。或者你可以使用数据库的任何一个基于文件的数据H2或MySql for big projcet –

+0

@Gianluca没有涉及错误的语法,请仔细检查您的代码! – n247s

1

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

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

注意如何从指数跃升“0”(if语句)索引“2”(在“creaEditore”的第一个参数)。如果它不会抱怨“parseInt”方法中的错误参数,则会抛出IndexOutOfBoundException,因为数组索引从0开始,而不是从1开始。