User Tools

Site Tools


java:formatting

Εγγραφή σε αρχεία κείμενου

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

Στο παρακάτω παράδειγμα, η κλάση ReadWithScanner της προηγούμενης ενότητας επεκτείνεται με μία επιπλέον μέθοδο για την εγγραφή των περιεχομένων του πίνακα των τηλεφωνικών αριθμών σε ένα αρχείο τύπου CSV (Comma Separated Values). Παρατηρήστε ότι για να ανοίξουμε ένα αρχείο για εγγραφή μέσω της κλάσης PrintWriter θα πρέπει αυτό να γίνει μέσα σε ένα try block (ή try-with-resources block) και θα πρέπει να διαχειριστούμε το java.io.FileNotFoundException.

ReadWithScannerAndWriteCSV.java
import java.util.*;
import java.io.*;
 
public class ReadWithScannerAndWriteCSV {
 
 
  public static void main(String []args) {
 
    TelephoneNumber[] numbers;
    numbers = readTelephoneNumbers("telephone-list.txt");
    printTelephoneNumbers(numbers);
    writeTelephoneNumbers2CSVfile(numbers, "contacts.csv");
  }
 
  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;
  }
 
  public static void writeTelephoneNumbers2CSVfile(TelephoneNumber[] numbers, String filename) {
 
    try(PrintWriter writer = new PrintWriter(filename)) {
      for(TelephoneNumber number : numbers) {
        writer.format("%d, %s\n", number.getNumber(), number.getName());
      }
    }
    catch(FileNotFoundException ex) {
      System.out.format("Unable to open file '%s' for writting!\n", filename);
    }
 
  }
}

Η κλάση PrintWriter, όπως και η κλάση PrintStream παρέχουν τη μέθοδο format (ή printf) για την εκτύπωση μορφοποιημένης εξόδου. Η έννοια της μορφοποιημένες εξόδου εξηγείται παρακάτω και εφαρμόζεται τόσο σε αρχεία όσο και σε εκτύπωση στην κονσόλα.

Μορφοποίηση Εξόδου

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

  1. Οι μέθοδοι print και println οι οποίες δέχονται μόνο ένα όρισμα είτε βασικού τύπου (int, long, double, byte etc), είτε αναφορικού τύπου (Object ή String)
  2. Η μέθοδος format μορφοποιεί με βάση ένα String μορφοποίησης ανάλογο με αυτό της printf στη γλώσσα C.

Οι print και println Μέθοδοι

Η κλήση των print ή println απαιτεί την εκτύπωση ενός αλφαριθμητικού. Εάν το όρισμα που λαμβάνουν οι μέθοδοι αυτές δεν είναι αλφαριθμητικό τότε

  • για αναφορικούς τύπους που δεν είναι String καλείται η μέθοδος toString(), προκειμένου να μετατραπούν τα ορίσματα σε String.
  • για βασικούς τύπους, αυτοί μετατρέπονται πρώτα σε αναφορικούς (int –> Integer, long –> Long) και στη συνέχεια καλείται η μέθοδος toString για αυτούς.

Η διαφορά μεταξύ των μεθόδων print και println είναι ότι η δεύτερη εκτυπώνει στο τέλος και ένα χαρακτήρα αλλαγής γραμμής.

Μπορείτε να δείτε το παρακάτω παράδειγμα:

Root.java
public class Root {
  public static void main(String[] args) {
    int i = 2;
    double r = Math.sqrt(i);
 
    System.out.print("The square root of ");
    System.out.print(i);
    System.out.print(" is ");
    System.out.print(r);
    System.out.println(".");
 
    i = 5;
    r = Math.sqrt(i);
    System.out.println("The square root of " + i + " is " + r + ".");
  }
}

Παρακάτω δίνεται το αποτέλεσμα της εκτέλεσης της κλάσης Root:

The square root of 2 is 1.4142135623730951.
The square root of 5 is 2.23606797749979.

Η μέθοδος format ή printf

Η μέθοδος format μορφοποιεί ένα string σε αναλογία με τη συνάρτηση printf στη γλώσσα C. Το ακόλουθο παράδειγμα SquareRoot μορφοποιεί δύο τιμές με μία μόνο κλήση της format:

SquareRoot.java
public class SquareRoot {
    public static void main(String[] args) {
        int i = 2;
        double r = Math.sqrt(i);
 
        System.out.format("The square root of %d is %f.%n", i, r);
    }
}

H έξοδος της κλάσης SquareRoot είναι: The square root of 2 is 1.414214.

Όλοι οι προσδιοριστές μορφοποίησης αρχίζουν με τον χαρακτήρα '%' και ακολουθούν 1 ή 2 χαρακτήρες που καθορίζουν το είδος της μορφοποιημένης εξόδου που παράγεται. Παρακάτω δίνονται μερικές από τις πιο συνήθεις μετατροπές:

  • το %d μορφοποιεί μια τιμή integer ως μια δεκαδική τιμή.
  • το %f μορφοποιεί μια floating point τιμή ως μια δεκαδική τιμή.
  • το %n εισάγει έναν platform-specific χαρακτήρα αλλαγής γραμμής.
  • το %x μορφοποιεί έναν integer ως μια δεκαεξαδική τιμή.
  • το %s μορφοποιεί ένα String.

Οι σημαντικότεροι προσδιοριστές μορφοποίησης δίνονται παρακάτω:

Ακολουθούν δύο παραδείγματα χρήσης των σημαντικότερων προσδιοριστών μορφοποίησης που παρουσιάστηκαν προηγούμενα.

MyFormat.java
public class MyFormat {
    public static void main(String[] args) {
        System.out.format("%f, 020.10f %n", Math.PI);
    }
}
TestFormat.java
import java.util.Calendar;
import java.util.Locale;
 
public class TestFormat {
 
    public static void main(String[] args) {
      long n = 461012;
      System.out.format("%d%n", n);      //  -->  "461012"
      System.out.format("%08d%n", n);    //  -->  "00461012"
      System.out.format("%+8d%n", n);    //  -->  " +461012"
      System.out.format("%,8d%n", n);    // -->  " 461,012"
      System.out.format("%+,8d%n%n", n); //  -->  "+461,012"
 
      double pi = Math.PI;
 
      System.out.format("%f%n", pi);       // -->  "3.141593"
      System.out.format("%.3f%n", pi);     // -->  "3.142"
      System.out.format("%10.3f%n", pi);   // -->  "     3.142"
      System.out.format("%-10.3f%n", pi);  // -->  "3.142"
      System.out.format(Locale.FRANCE,
                        "%-10.4f%n%n", pi); // -->  "3,1416"
 
      Calendar c = Calendar.getInstance();
      System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"
 
      System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"
 
      System.out.format("%tD%n", c);    // -->  "05/29/06"
    }
}
java/formatting.txt · Last modified: 2021/05/14 15:09 (external edit)