【问题标题】:Read from file with BufferedReader使用 BufferedReader 从文件中读取
【发布时间】:2017-08-12 11:41:54
【问题描述】:

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

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

我现在的问题是使用 BufferedReader 从文件中读取。 问题是,如果我取消注释底部 3 行中的任何 1 行,BufferedReader 每隔一行读取一次。如果我不使用它们,则会出现异常,因为下一个输入是字符串类型。 我曾考虑使用带有 .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 文件中的另一个错误!原来有一个空间而不是双。它现在似乎正在工作。但是对于以后如何处理此类文件错误有什么建议吗?

【问题讨论】:

  • 在您的 while 循环中,您一次将一行读入变量line,然后将split 转换为idnamefromFileyear 和@987654327 @ - 你为什么要在循环中进一步阅读 line - 这是重复的
  • 请提供有关您发布的代码的方法的更多详细信息。它会抛出IOException 吗?您从 .txt 文件中读取什么样的数据?它们是每行 4 个标记(字符串或数字)吗? 3 条注释掉的行很可能应该被注释掉。 :-)
  • @JacobO 使用您当前遇到的完整错误更新您的答案。
  • 开始将String[] split = line.split(" ", 4); 更改为String[] split = line.split(" ");
  • 您可能试图读取底部的空行。您应该将 BufferedReader 放在 Try and Catch 块上。你也可以去掉最后一行。

标签: java bufferedreader java-io


【解决方案1】:

问题是,如果我取消注释底部 3 行中的任何 1 行,BufferedReader 会每隔一行读取一次。

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

【讨论】:

    【解决方案2】:

    发布的代码的可编译版本可能是

      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 个空格。

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

    【讨论】:

    • 谢谢,我发现错误出现在正在读取的文件中。我从文件中读取的方式是双空格,因为名称字段的工作方式类似于“Bob B”,所以名字和姓氏一起在同一个字段中。
    • 如果不完全读取 4 个标记,您肯定需要确保执行某些操作。加上许多其他用于错误处理的东西。快乐编码! :-)
    • 谢谢!我已经在处理异常了,但是,少于 4 个令牌绝对是优先修复!
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2013-04-12
    • 2014-03-08
    • 2013-06-12
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多