使用扫描仪读取文件数据

时间:2018-07-12 16:38:36

标签: java

我正在使用的方法是readDataFromFile()。它读取一个文件,该文件的数据用Tabs分隔,例如:

Bird    Golden Eagle    Eddie
Mammal  Tiger   Tommy
Mammal  Lion    Leo
Bird    Parrot  Polly
Reptile Cobra   Colin

这是我被要求做的,但是我可能不太了解如何创建它,任何帮助将不胜感激。

我得到的问题:

  

应忽略行首或末尾的空格。您   应该提取三个子串,然后创建并添加一个Animal   反对动物园。您应该忽略第一个子字符串(   以上示例),因为本部分不需要   项目。另请注意,类似于您应具有的代码   注释掉,addAnimal()方法将需要第三个参数   “ this”代表集合的所有者。成功   完成此步骤后,您将有一个“基本”工作版本   readDataFromFile()

动物园课:

public class MyZoo
{
   private String zooId;
   private int nextAnimalIdNumber;
   private TreeMap<String, Animal> animals;
   private Animal animal;

   public MyZoo(String zooId)
   {
      this.zooId = zooId.trim().substring(0,3).toUpperCase();
      nextAnimalIdNumber = 0;
      animals = new TreeMap<String, Animal>();
   }

   public String allocateId()
   {
      nextAnimalIdNumber++;
      String s = Integer.toString(nextAnimalIdNumber);
      while ( s.length()<6 )
         s = "0" + s;
      return zooId + "_" +  s;
   }

   public void addAnimal(Animal animal)
   {
      animals.put(animal.getName(), animal);
      this.animal = animal;
   }

   public void readDataFromFile() throws FileNotFoundException
   {
      int noOfAnimalsRead = 0;

      String fileName = null;

      JFrame mainWindow = new JFrame();
      FileDialog fileDialogBox = new FileDialog(mainWindow, "Open", FileDialog.LOAD);
      fileDialogBox.setDirectory("."); 
      fileDialogBox.setVisible(true);

      fileName = fileDialogBox.getFile();
      String directoryPath = fileDialogBox.getDirectory();

      File dataFile = new File (fileName);
      Scanner scanner = new Scanner(dataFile);
      //System.out.println("The selected file is " + fileName);

      scanner.next();
      while(scanner.hasNext())
      {
      String name = scanner.nextLine();
      System.out.println("Animal: " + name);
      }
    }

动物类:

public class Animal
{
   private String id;
   private String species;
   private String name;
   public Animal(String species, String name, MyZoo owner)
   {
      id = owner.allocateId();
      this.species = species;
      this.name  = name;
   }

   public String getId()
   {
      return id;
   }

   public String getName()
   {
      return name;
   }

   public String getSpecies()
   {
      return species;
   }

   public String toString()
   {
      return id + "  " + name + ": a " + species;
   }
}

2 个答案:

答案 0 :(得分:2)

while( scanner.hasNext() ) {
    String fileLine = scanner.nextLine()
    String[] animalNames = fileLine.split("\t")
    ...
}

您已经在代码中使用了扫描仪,因此我假设您大致了解扫描仪的工作原理。上面的代码首先以字符串形式读取下一行输入。因此,例如,在第一行之后,

fileLine := "Bird    Golden Eagle    Eddie"

然后,我声明一个名为animalNames的字符串数组,并将其设置为等于fileLine.split("\t")。您可以在String上调用此方法-它所执行的操作是返回子字符串数组,该子字符串由您提供的内容分隔。在这种情况下,我给函数"\t",它是代表制表符的字符。因此,在这一行之后,

animalNames := {"Bird", "Golden Eagle", "Eddie"}

由于您现在有了一个字符串数组,因此可以通过从其中选择项目来完成剩下的工作-例如,

animalNames[0] := "Bird"
animalNames[1] := "Golden Eagle"
animalNames[2] := "Eddie"

答案 1 :(得分:0)

您可以简单地使用Scanner.next来读取文件(这里我使用了String来匹配文件中的内容)

  

查找并返回此扫描仪的下一个完整令牌。完整的令牌在其前面,然后是与定界符模式匹配的输入

String data = "Bird\tGolden    Eagle \t Eddie\nMammal \t Tiger  Tommy";
Scanner scanner = new Scanner(data);

while (scanner.hasNext()) {
    System.out.println("Animal: " + scanner.next());
}
scanner.close();

输出:

Animal: Bird
Animal: Golden
Animal: Eagle
Animal: Eddie
Animal: Mammal
Animal: Tiger
Animal: Tommy

这将使用类中定义的Scanner中的分隔符

  

扫描程序使用定界符模式将其输入分为令牌,默认情况下,该定界符与空格匹配

我们可以使用来查看默认值

System.out.println(scanner.delimiter());
  

\ p {javaWhitespace} +