如何创建一种利用扫描仪读取文件的方法?

时间:2019-05-08 12:38:25

标签: java file java.util.scanner bufferedreader

这是我的家庭作业:

  

在DOTOR类中编写一个名为readInEntrants()的公共实例方法,该方法不带任何参数且不返回任何值。该方法将需要从文件entrants.txt中读取。

     

该方法的代码应执行以下操作。

     
      
  • 提示用户选择适当的文本文件。
  •   
  • 充分利用BufferedReaderScanner对象来逐行读取文件。
  •   
  • 在读取每行(包含Entrant的名称及其汽车类别)时,应创建一个新的Entrant对象,并使用在该行中找到的值来设置其实例变量。您的代码可能假定提供的所有输入均有效。最后,应将Entrant实例添加到实例变量entrants引用的列表中。
  •   

代码:

import java.util.*;

import java.io.*;

import ou.*;


/**
 * Class DOTOR
 * 

 */
public class DOTOR
{
   // instance variable
   private List<Entrant> entrants;


   /**
    * Constructor for objects of class DOTOR
    */
   public DOTOR()
   {
      entrants = new ArrayList<>();
   }

   public void readInEntrants()
   {
  System.out.println("Choose file");
  String textFileInput = OUFileChooser.getFilename();
  List<Entrant> entrants = new ArrayList<>();
  try
  {
     FileReader file = new FileReader(textFileInput);
     BufferedReader buffer = new BufferedReader(file);
     String fileLine = "";
     Scanner lineScanner;
     String racerName;
     String raceNumber;
     while ((fileLine = buffer.readLine())!= null)
     {
        lineScanner = new Scanner(fileLine);
        lineScanner.useDelimiter(",");
        racerName = lineScanner.next();
        raceNumber = lineScanner.next();

     }
     buffer.close();
  }
  catch (Exception anException)
  {
     System.out.println("A read error has occurred");
  }
   }
}

还有一个单独的类,称为Entrant。

public class Entrant {

  private String name;
  private String category;

  public Entrant(String name, String category) {
  this.name =name;
  this.category = category;
  }      

//getters and setters

}

文件中的行示例:

Jon Snow,R6
Mary higgins, r4
tom hopeful, r6 

我被困住了。我不知道这段代码应该是什么样子。

2 个答案:

答案 0 :(得分:1)

您可能正在寻找的是以下代码。它使用Scanner解析文件名,并继续使用BufferedReader读取文件。

 public void readInEntrants() {

  // ask for file name and create scanner to get input
  System.out.println("please enter the name of the file you want read:");
  Scanner scanner = new Scanner(System.in);
  String fileName = scanner.nextLine();

  // replace path/to/file with the actual path to the entrants.txt file
  File entrantsFile = new File("path/to/file/" + fileName);
  System.out.println("file name + path ="  + entrantsFile);

  // create buffered reader with resources and read all lines of the file
  // use try-with-resources to prevent resource leakage
  try (BufferedReader bufReader =  new BufferedReader(new FileReader(entrantsFile))) {
    String line;
    while ((line = bufReader.readLine()) !=  null) {
      // split each line in two compenents (seperated by ,)
      String[] entrantInfo = line.split(",");
      // turn String components to object instance
      Entrant entrant = new Entrant(entrantInfo[0].trim(), entrantInfo[1].trim());
      entrants.add(entrant);
    }
  }
  catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
  }
  catch (IOException e) {
    System.out.println(e.getMessage());
  }

  entrants.forEach(System.out::println);
}

还将toString方法添加到您的entrant

public String toString() {
  return "Entrant{" + "name='" + name + '\'' + ", category='" + category + '\'' + '}';
}

答案 1 :(得分:0)

是否可以粘贴您要读取的文本文件示例,以获得更具体的解决方案?我不确定它的结构。

执行以下操作,创建一个新的Scanner对象:

Scanner sc = new Scanner(new File("filename.txt"));

接下来,您可以通过逐行读取每一行来创建新的字符串

String s = sc.next();

您可以在此处创建一个新的Entrant对象,并传入字符串中的值。