java:read_from_file

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:read_from_file [2016/03/19 05:35]
gthanos [Διαβάζοντας γραμμή-γραμμή]
java:read_from_file [2017/04/28 11:15] (current)
gthanos [Παράδειγμα διαβάσματος από δυαδικό αρχείο]
Line 85: Line 85:
 ===== Χρησιμοποιώντας την κλάση Scanner ===== ===== Χρησιμοποιώντας την κλάση Scanner =====
  
-Εκτός από την δυνατότητα που έχετε να διαβάζετε γραμμή-γραμμή η Java σας δίνει την επιπλέον δυνατότητα να διαβάζετε συγκεκριμένους τύπους δεδομένων μέσω της κλάσης [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Scanner.html|java.util.Scanner]]. Η κλάση Scanner σας δίνει την δυνατότητα να διαβάζετε από ένα αρχείο ή από την κονσόλα τα δεδομένα σας είτε ως //​primitive//​ τύπους δεδομένων (int, byte, long, double κλπ), είτε ως String. Επίσης σας δίνει την δυνατότητα να διαβάσετε μία ολόκληρη γραμμή,​ όπως κάνατε και με χρήση της κλάσης [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedReader.html|java.io.BufferedReader]]+Εκτός από την δυνατότητα που έχετε να διαβάζετε γραμμή-γραμμή η Java σας δίνει την επιπλέον δυνατότητα να διαβάζετε συγκεκριμένους τύπους δεδομένων μέσω της κλάσης [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Scanner.html|java.util.Scanner]]. Η κλάση Scanner σας δίνει την δυνατότητα να διαβάζετε από ένα αρχείο ή από την κονσόλα τα δεδομένα σας είτε ως //​primitive//​ τύπους δεδομένων (int, byte, long, double κλπ), είτε ως String. Επίσης σας δίνει την δυνατότητα να διαβάσετε μία ολόκληρη γραμμή,​ όπως κάνατε και με χρήση της κλάσης [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedReader.html|java.io.BufferedReader]]
 + 
 +Οι μέθοδοι της κλάσης //Scanner// έχουν συνοπτικά ως εξής: 
 + 
 +**Κατασκευαστές** 
 +  * ''​public Scanner(File file)''​ : Δημιουργεί ένα νέο αντικείμενο της κλάσης Scanner προκειμένου να διαβάσουμε από το αρχείο //file//. 
 +  * ''​public Scanner(InputStream source)''​ : Δημιουργεί ένα νέο αντικείμενο της κλάσης Scanner προκειμένου να διαβάσουμε από ένα [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​InputStream.html|java.io.InputStream]] //source//. Ο συγκεκριμένος κατασκευαστής είναι χρήσιμος εφόσον θέλουμε να διαβάσουμε από την κονσόλα. 
 + 
 +Ένα αρχείο μπορείτε να το ανοίξετε είτε με χρήση της κλάσης File που είδαμε νωρίτερα είτε με χρήση της κλάσης [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​InputStream.html|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 ==== 
 + 
 +<code java ReadWithScanner.java>​ 
 +import java.util.Scanner;​ 
 +import java.io.File;​ 
 + 
 +public class ReadWithScanner { 
 +  public static void main(String []args) { 
 +    String firstname=null,​ lastname=null,​ number=null;​ 
 +    int i=0; 
 +    TelephoneNumber numbers[] = new TelephoneNumber[5];​ 
 +    try { 
 +      Scanner sc = new Scanner(new File("​telephone-list.txt"​));​ 
 +       
 +      while( sc.hasNext() ) {         
 +        firstname = sc.next();​ 
 +        lastname = sc.next();​ 
 +        number = sc.next();​ 
 + 
 +        if( lastname.charAt( lastname.length() -1 ) == ','​ )  
 +          lastname = lastname.substring(0,​ lastname.length() -1); 
 + 
 +        numbers[i++] = new TelephoneNumber(firstname+"​ "​+lastname,​ number); 
 +      } 
 +    } catch(Exception ex) { 
 +      ex.printStackTrace();​ 
 +    } 
 +    for(TelephoneNumber telephoneNumber : numbers) { 
 +      System.out.println(telephoneNumber);​ 
 +    } 
 +  } 
 +
 +</​code>​ 
 + 
 +<WRAP tip 80% center round> 
 +Το παραπάνω παράδειγμα θα μπορούσατε να το εκτελέσετε διαβάζοντας από την κονσόλα,​ αντί να διαβάζετε από αρχείο προκειμένου να διαβάσετε από την κονσόλα θα μπορούσατε να αντικαταστήσετε την γραμμή 
 +<code java> 
 +Scanner sc = new Scanner(new File("​telephone-list.txt"​));​ 
 +</​code>​ 
 + 
 +με την γραμμή 
 + 
 +<code java> 
 +Scanner sc = new Scanner(System.in);​ 
 +</​code>​ 
 +</​WRAP>​ 
 + 
 + 
 +===== Διαβάζοντας δυαδικά δεδομένα από αρχείο ===== 
 + 
 +Εκτός από διάβασμα αρχείων κειμένου όπως αυτά που είδαμε παραπάνω ή διάβασμα από την κονσόλα υπάρχει η πιθανόντητα να θέλετε να διαβάσετε δυαδικά αρχεία. Τα δυαδικά αρχεία περιέχουν πληροφορία η οποία δεν μπορεί να κωδικοποιηθεί σε χαρακτήρες. Παραδείγματα δυαδικών αρχείων είναι μία εικόνα (jpg, png κλπ), ένα video (οποιουδήποτε format), ένα αρχείο pdf, ένα αρχείο MSWord, MSExcel κ.α. Σε αυτές τις περιπτώσεις το διάβασμα της πληροφορίας με τις κλάσεις που παρουσιάσαμε προηγούμενα δεν είναι δυνατόν να υλοποιηθεί.  
 + 
 +Αντ'​ αυτού υπάρχει η κλάση [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileInputStream.html|java.io.FileInputStream]] η οποία επιτρέπει το διάβασμα δυαδικών αρχείων ως εξής: 
 + 
 +**Κατασκευαστές** 
 +  * ''​FileInputStream(String filename)''​ : Δημιουργεί ένα αντικείμενο της κλάσης //​FileInputStream//​ από το αρχείο με όνομα filename. Στη θέση του //String// filename θα πρέπει να βάλετε το path προς το αρχείο και όχι μόνο το όνομα του. 
 +  * ''​FileInputStream(File file)''​ : Δημιουργεί ένα αντικείμενο της κλάσης //​FileInputStream//​ από ένα αντικείμενο της κλάσης //File//. 
 + 
 +**Μέθοδοι** 
 +  * ''​int read(byte[] b)''​ : Διαβάζετε ένα αρχείο μέσω της μεθόδου read. Σε κάθε διάβασμα αποθηκεύονται τα δεδομενα σας στον πίνακα //b//. Πριν την κλήση της read, θα πρέπει να έχετε αρχικοποιήσει τον πίνακα //b// σε ένα μέγεθος της επιλογής σας, προκειμένου να μπορούν να αποθηκευτούν τα δεδομένα σας σε αυτόν.  
 +    * Η μέθοδος διαβάζει το πολύ //​b.length//​ bytes.  
 +    * Επιστρέφει τον αριθμό των bytes που διάβασε. 
 + 
 +==== Παράδειγμα διαβάσματος από δυαδικό αρχείο ==== 
 + 
 +Το παρακάτω πρόγραμμα διαβάζει το όνομα ενός αρχείου από το πληκτρολόγιο και στη συνέχεια διαβάζει το περιεχόμενο του αρχείου ως δυαδικό αρχείο. 
 + 
 +<code java ReadBinFile.java>​ 
 +import java.io.*;​ 
 +import java.util.*;​ 
 + 
 +public class ReadBinFile { 
 +  public static void main(String [] args) { 
 +     
 +    Scanner sc = new Scanner(System.in);​ 
 +    System.out.print("​Enter filename: "); 
 +    String readFilename = sc.next();​ 
 +    File readFile = new File(readFilename); ​    
 +     
 +    if( !readFile.isFile() ) { 
 +      System.err.println("​Input file does not exist or is not a regular file!"​);​ 
 +      return; 
 +    } 
 +    if( !readFile.canRead() ) { 
 +      System.err.println("​Input file is not readable!"​);​ 
 +      return; 
 +    } 
 +     
 +    try { 
 +      byte []buffer = new byte[2048];​ 
 +      FileInputStream in = new FileInputStream(readFile);​ 
 +      int read_len; 
 +      while( (read_len = in.read(buffer)) != -1 ) { 
 +         
 +      } 
 +       
 +      in.close();​ 
 +    } catch( IOException ex ) { 
 +      ex.printStackTrace();​ 
 +    } 
 +  } 
 +
 +</​code>​ 
 + 
 +|Προηγούμενο:​ [[ java:​class_file | Η κλάση File ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​write_to_file | Γράφοντας σε αρχείο]] | 
 + 
  
java/read_from_file.1458365749.txt.gz · Last modified: 2016/03/19 05:35 by gthanos