Melissa Stewart
Melissa Stewart

Reputation: 35

Read file data using Scanner

The method I am working on is readDataFromFile(). It reads a file that has data separated with Tabs such as:

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

This is what I have been asked to do however I may not fully understand how to create this, any help would be much appreciated.

Question I have been given:

Spaces at the beginning or end of the line should be ignored. You should extract the three substrings and then create and add an Animal object to the zoo. You should ignore the first substring ("Bird" in the above example) as it is not required for this part of this project. Also note that, similar to the code you should have commented out, the addAnimal() method will require a third parameter "this" representing the owner of the collection. On successful completion of this step you will have a "basic" working version of readDataFromFile()

Zoo class:

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);
      }
    }

Animal Class:

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;
   }
}

Upvotes: 0

Views: 84

Answers (2)

AxelH
AxelH

Reputation: 14572

You can simply use Scanner.next to read your file (here I used a String that match what you could find in the file)

Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern

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();

Output :

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

This will used the delimiter from Scanner as defined in the class

A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace

And we can see the default value using

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

\p{javaWhitespace}+

Upvotes: 0

Green Cloak Guy
Green Cloak Guy

Reputation: 24691

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

You already are using a scanner in your code, so I'm assuming you know in general how the scanner works. The above code first reads in the next line of input, as a String. So, for example, after that first bit,

fileLine := "Bird    Golden Eagle    Eddie"

Then, I declare an Array of strings called animalNames, and set it equal to fileLine.split("\t"). This is a method you can call on a String - what it does is it returns an array of substrings, delimited by whatever you give it. In this case, I give the function "\t", which is the character that represents a tab. So, after this line,

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

Since you now have an array of strings, you can do the rest of the assignment by picking items out of it - for example,

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

Upvotes: 2

Related Questions