User Tools

Site Tools


java:character_streams

This is an old revision of the document!


Ροές Χαρακτήρων (Character Streams)

Η Java χρησιμοποιεί για την κωδικοποίηση χαρακτήρων τη σύμβαση Unicode. Οποιοδήποτε αρχείο περιέχει χαρακτήρες, για κάθε χαρακτήρα περιέχει την ισοδύναμη δυαδική μορφή του χαρακτήρα. Ένα character stream I/O μεταφράζει αυτόματα της δυαδικές τιμές σε unicode χαρακτήρες.

Χρησιμοποιώντας Streams Xαρακτήρων

Όλες οι κλάσεις που περιγράφουν stream χαρακτήρων κατάγονται από τις κλάσεις Reader και Writer. Σε αναλογία και με τα byte streams που είδαμε προηγούμενα, υπάρχουν οι κλάσεις FileReader και FileWriter που επιτρέπουν την ανάγνωση και την εγγραφή streams χαρακτήρων από/σε αρχείο. Το παρακάτω παράδειγμα της κλάσης CopyCharacters παρουσιάζει τις κλάσεις αυτές.

CopyCharacters.java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class CopyCharacters {
  public static void main(String[] args) throws IOException {
 
    FileReader inputStream = null;
    FileWriter outputStream = null;
 
    try {
      String filename;
      if(args.length > 0)
        filename = args[0];
      else
        filename = "xanadu.txt";
 
      inputStream = new FileReader(filename);
      outputStream = new FileWriter("__"+filename);
 
      int c;
      while ((c = inputStream.read()) != -1) {
        outputStream.write(c);
      }
    } finally {
      if (inputStream != null) {
        inputStream.close();
      }
      if (outputStream != null) {
        outputStream.close();
      }
    }
  }
}

Η κλάση CopyCharacters είναι παρόμοια με την κλάση CopyBytes. Η σημαντικότερη διαφορά είναι ότι η CopyCharacters χρησιμοποιεί τις κλάσεις FileWriter για είσοδο και έξοδο στη θέση των FileInputStream και FileOutputStream. Παρατηρήστε ότι τόσο η κλάση CopyBytes όσο και η κλάση CopyCharacters χρησιμοποιούν μια μεταβλητή int για να διαβάσουν και να γράψουν. Ωστόσο, στο CopyCharacters, η μεταβλητή int κρατά μια τιμή χαρακτήρα στα 16 τελευταία bit του, ενώ στο CopyBytes, η μεταβλητή int κρατά μια byte τιμή στα τελευταία 8 bit του.

Τα streams χαρακτήρων είναι «περιτυλίγματα» των byte streams. Κάθε stream χαρακτήρων χρησιμοποιεί το byte stream για την εκτέλεση της φυσικής I/O, ενώ το stream χαρακτήρων χειρίζεται τη μετάφραση μεταξύ των χαρακτήρων και bytes. Η κλάση FileReader, για παράδειγμα, χρησιμοποιεί την κλάση FileInputStream, ενώ η FileWriter χρησιμοποιεί την κλάση FileOutputStream.

Διαβάζοντας και γράφοντας γραμμή-γραμμή σε αρχείο κειμένου

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

Μια συνηθισμένη ομαδοποίηση χαρακτήρων είναι γραμμή-γραμμή. Η γραμμή ορίζεται ως μία σειρά από χαρακτήρες με ένα χαρακτήρα αλλαγής γραμμής στο τέλος. Ο χαρακτήρας αλλαγής γραμμής μπορεί να είναι μια ακολουθία χαρακτήρων carriege return/line feed ('\r''\n') για το λειτουργικό σύστημα Windows, ένας χαρακτήρας carriege return ('\r'), ή ένας χαρακτήρας line feed ('\n') για το λειτουργικό σύστημα GNU/Linux.

Ας τροποποιήσουμε το παράδειγμα CopyCharacters για να χρησιμοποιήσουμε I/O χαρακτήρων για να διαβάσουμε και να γράψουμε γραμμή-γραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί, τις BufferedReader και PrintWriter.

Το παράδειγμα CopyLines επικαλείται τις BufferedReader.readLine και PrintWriter.println για να διαβάσει και να γράψει μία γραμμή αντιστοίχως.

CopyLines.java
import java.io.*;
 
public class CopyLines {
  public static void main(String[] args) throws IOException {
 
    BufferedReader inputStream = null;
    PrintWriter outputStream = null;
 
    try {
      String filename;
      if(args.length > 0)
        filename = args[0];
      else
        filename = "xanadu.txt";
 
      inputStream = new BufferedReader(new FileReader(filename));
      outputStream = new PrintWriter(new FileWriter("__"+filename));
 
      String l;
      while ((l = inputStream.readLine()) != null) {
        outputStream.println(l);
      }
    } finally {
      if (inputStream != null) {
        inputStream.close();
      }
      if (outputStream != null) {
        outputStream.close();
      }
    }
  }
}

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

java/character_streams.1486471103.txt.gz · Last modified: 2017/02/07 12:38 (external edit)