2017-03-21 78 views
1

基本上我有一个从.txt文件读取多行的任务。 每行文本文件中有4个值,每个值由2个空格分隔。 该文件中有大约10行数据。从BufferedReader中读取文件

从文件中获取输入后,程序将其放到数据库中。数据库连接功能正常工作。

我现在的问题是使用BufferedReader从文件中读取数据。 问题是,如果我取消注释底部3行中的任意一行,则BufferedReader会读取其他所有行。如果我不使用它们,那么下一个输入是String类型就有一个异常。 我已经打算使用带有.hasNextLine()方法的扫描仪。

有什么想法可能是问题以及如何解决它? 谢谢。

File file = new File(FILE_INPUT_NAME); 
FileReader fr = new FileReader(file); 
BufferedReader readFile = new BufferedReader(fr); 
String line = null; 
while ((line = readFile.readLine()) != null) { 
    String[] split = line.split(" ", 4); 

    String id = split[0]; 
    nameFromFile = split[1]; 
    String year = split[2]; 
    String mark = split[3]; 

    idFromFile = Integer.parseInt(id); 
    yearOfStudyFromFile = Integer.parseInt(year); 
    markFromFile = Integer.parseInt(mark); 

    //line = readFile.readLine(); 
    //readFile.readLine(); 
    //System.out.println(readFile.readLine()); 
} 

编辑:.txt文件的格式有错误。一个缺失的价值。 但现在我得到一个ArrayOutOfBoundsException。

编辑编辑:.txt文件中的另一个错误!原来有一个单一的空间,而不是一个双。它现在似乎在工作。但是,有关如何处理将来像这样的文件错误的任何建议?

+0

在你的while循环中,你正在读取一行到-a时间的变量'line',然后被分割为'id ''''name'File','year'和'mark' - 为什么你要在循环中进一步读取'line' - 这是重复的 –

+1

请提供更多关于你发布代码的方法的细节。它抛出一个'IOException'吗?你从.txt文件读取什么样的数据?他们每行有4个令牌(字符串或数字)吗? 3条注释掉的行最有可能应该保留注释。 :-) – PNS

+0

该文件包含以下信息:id(Student's ID),名称,学习年份和标记(满分为100) –

回答

0

代码的编译版本发布可以是上面

public void read() throws IOException { 
    File file = new File(FILE_INPUT_NAME); 
    FileReader fr = new FileReader(file); 
    BufferedReader readFile = new BufferedReader(fr); 
    String line; 
    while ((line = readFile.readLine()) != null) { 
     String[] split = line.split(" ", 4); 
     if (split.length != 4) { // Not enough tokens (e.g., empty line) read 
     continue; 
     } 
     String id = split[0]; 
     String nameFromFile = split[1]; 
     String year = split[2]; 
     String mark = split[3]; 

     int idFromFile = Integer.parseInt(id); 
     int yearOfStudyFromFile = Integer.parseInt(year); 
     int markFromFile = Integer.parseInt(mark); 

     //line = readFile.readLine(); 
     //readFile.readLine(); 
     //System.out.println(readFile.readLine()); 
    } 
    } 

使用单个空间(" "而不是原始" ")。为了分割任何数量的变化,可以使用正则表达式,例如, "\\s+"。当然,如果反映输入数据的结构,也可以使用2个空格。

该方法应该如何处理提取的值(例如,将它们返回某种类型的对象中,或将它们直接保存到数据库中)取决于使用它的应用程序。

+0

谢谢,我发现这个错误发生在它读取的文件中。我从文件中读取的方式是双倍空间,因为名称字段的工作方式类似于“Bob B”,所以名字和姓氏在同一个字段中。 –

+0

如果不是完全读取4个标记,您肯定需要确保您执行了一些操作。加上许多其他的错误处理。快乐的编码! :-) – PNS

+0

谢谢!我已经在做例外,但是,少于4个令牌肯定是优先解决方案! –

1

问题是,如果我取消注释底部3行中的任意一行,BufferedReader会读取其他所有行。

正确。如果你放入任何这些代码行,读取的文本行将被丢弃并且不被处理。您已经在阅读while条件。你不需要再读一遍。如果你把任何这些行放入,它们将被丢弃而不是进行

相关问题