User Tools

Site Tools


java:util_scanner_class

Η κλάση Scanner

Παρακάτω θα δούμε εναλλακτικούς τρόπους με τους οποίους μπορούμε να διαβάσουμε από ένα αρχείο κειμένου. Για τα παραδείγματα που ακολουθούν υποθέστε ότι καλούμαστε να διαβάσουμε το παρακάτω αρχείο που περιέχει τα ονόματα και τα τηλέφωνα ενός τηλεφωνικού καταλόγου.

telephone-list.txt
John Smith 6944854544
Robert Parson 6978456123
Nick Carlson 6982147852
Barbara Miller 6978852456
Max Taylor 6936785412

Τα οποία θέλουμε να τα αποθηκεύσουμε σε ένα πίνακα από αντικείμενα της παρακάτω κλάσης TelephoneNumber

TelephoneNumber.java
public class TelephoneNumber {
  private String name;
  private long number;
 
  public TelephoneNumber(String newName, long newNumber) {
    name = newName;
    number = newNumber;
  }
 
  public String getName() { return name; }
  public long getNumber() { return number; }
  public void setName(String newName) { name = newName; }
  public void setNumber(long newNumber) { number = newNumber; }
 
  public String toString() {
    return "Name: "+name+", Number: "+number;
  }
}

Η Java παρέχει την επιπλέον δυνατότητα να διαβάζετε συγκεκριμένους τύπους δεδομένων μέσω της κλάσης java.util.Scanner. Η κλάση Scanner επιτρέπει το διάβασμα από μία ροή χαρακτήρων γραμμή-γραμμή ή λέξη-λέξη. Όταν διαβάζετε λέξη-λέξη παρέχεται επιπλέον η δυνατότητα μετατροπής της πληροφορίας σε primitive τύπους δεδομένων όπως byte, short, int, long, float, double κ.α.

Οι μέθοδοι της κλάσης Scanner έχουν συνοπτικά ως εξής:

Κατασκευαστές

  • public Scanner(File file) : Δημιουργεί ένα νέο αντικείμενο της κλάσης Scanner προκειμένου να διαβάσουμε από το αρχείο file.
  • public Scanner(InputStream source) : Δημιουργεί ένα νέο αντικείμενο της κλάσης Scanner προκειμένου να διαβάσουμε από ένα java.io.InputStream source. Ο συγκεκριμένος κατασκευαστής είναι χρήσιμος εφόσον θέλουμε να διαβάσουμε από την κονσόλα.

Ένα αρχείο μπορείτε να το ανοίξετε είτε με χρήση της κλάσης File που είδαμε νωρίτερα είτε με χρήση της κλάσης java.io.InputStream, προκειμένου να χρησιμοποιήσετε την κλάση Scanner. Δείτε τα παραδείγματα χρήσης που ακολουθούν.

Μέθοδοι

  • public void close() : Κλείνει το Scanner. Μετά την κλήση της close δεν μπορείτε να διαβάσετε τίποτα.
  • public boolean hasNext() : Επιστρέφει true εάν υπάρχει κάτι για διάβασμα.
  • public String next() : Επιστρέφει το επόμενο String για διάβασμα. Το επόμενο String οριοθετείται μέχρι να βρεθεί κενό ή χαρακτήρας αλλαγής γραμμής.
  • public String nextLine() : Επιστρέφει την επόμενη γραμμή. Το τέλος της γραμμής οριοθετείται από την ύπαρξη του χαρακτήρα αλλαγής γραμμής newline \n ή carriege return \r ή συνδυασμό και των δύο.
  • public boolean hasNextInt() : Επιστρέφει true εάν υπάρχει κάτι για διάβασμα το οποίο μπορεί να μεταφραστεί ως ακέραιος. Εάν επιστρέψει true, διαβάζουμε με την μέθοδο nextInt().
  • public int nextInt() : Διαβάζει και επιστρέφει έναν ακέραιο αριθμό.
  • public boolean hasNextDouble() : Επιστρέφει true εάν υπάρχει κάτι για διάβασμα το οποίο μπορεί να μεταφραστεί ως double. Εάν επιστρέψει true, διαβάζουμε με την μέθοδο nextDouble().
  • public int nextDouble() : Διαβάζει και επιστρέφει έναν αριθμό double.
  • public boolean hasNextBoolean() : Επιστρέφει true εάν υπάρχει κάτι για διάβασμα το οποίο μπορεί να μεταφραστεί ως boolean. Εάν επιστρέψει true, διαβάζουμε με την μέθοδο nextBoolean().
  • public int nextBoolean() : Διαβάζει και επιστρέφει μία τιμή boolean.

Παράδειγμα ανάγνωσης με χρήση της Scanner

Το παρακάτω παράδειγμα διαβάζει από ένα αρχείο ένα σύνολο εγγραφών και δημιουργεί ένα πίνακα αντικειμένων τύπου TelephoneNumber. Στη συνέχεια εκτυπώνει τα περιεχόμενα του πίνακα στην κονσόλα.

ReadWithScanner.java
public class ReadWithScanner {
  public static void main(String []args) {
 
    TelephoneNumber[] numbers;
    numbers = readTelephoneNumbers("telephone-list.txt");
    printTelephoneNumbers(numbers);
  }
 
  public static void printTelephoneNumbers(TelephoneNumber[] numbers) {
    for(TelephoneNumber number : numbers) {
      System.out.println(number);
    }
  }
 
  public static TelephoneNumber[] readTelephoneNumbers(String filename) {
    String firstname, lastname;
 
    long number;
    int i=0;
    TelephoneNumber numbers[] = new TelephoneNumber[5];
    try(Scanner sc = new Scanner(new File(filename))) {
 
      while( sc.hasNext() ) {        
        firstname = sc.next();
        lastname = sc.next();
        number = sc.nextLong();
 
        numbers[i++] = new TelephoneNumber(firstname+" "+lastname, number);
      }
 
    } catch(InputMismatchException ex) {
      System.out.println("Invalid file contents!");
    } catch(FileNotFoundException ex) {
      System.out.println("Unable to open '"+filename+"'");
    }
 
    return numbers;
  }
 
}

Το παραπάνω παράδειγμα θα μπορούσατε να το εκτελέσετε διαβάζοντας από το πληκτρολόγιο, αντί να διαβάζετε από αρχείο. Για να διαβάσετε από την κονσόλα θα μπορούσατε να αντικαταστήσετε τη γραμμή

Scanner sc = new Scanner(new File("telephone-list.txt"))

με την γραμμή

Scanner sc = new Scanner(System.in)
java/util_scanner_class.txt · Last modified: 2021/05/14 15:13 (external edit)