Χειρισμός αρχείων

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Επισκόπηση

Δευτερεύουσα μνήμη

Τα προγράμματα συχνά πρέπει να μεταφέρουν τα δεδομένα τους σε δευτερεύουσα μνήμη (μονάδα SSD, μαγνητικό δίσκο, CD/DVD, μνήμη USB, κάρτα μνήμης, ταινία). Οι λόγοι που το επιβάλλουν αυτό είναι οι παρακάτω:

Η διαδικασία μεταφοράς των δεδομένων μεταξύ του προγράμματος και εξωτερικών συσκευών καλείται είσοδος/έξοδος (input/output) ή Ε/Ε (I/O).

Παράσταση δεδομένων

Τα δεδομένα σε ένα αρχείο μπορούμε να τα παραστήσουμε σε δύο μορφές.

Παραδείγματα παράστασης

ΤύποςΤιμήΔυαδική παράστασηΠαράσταση κειμένου
int4200000000 00000000 00000000 0010101000110100 00110010
short4200000000 0010101000110100 00110010
chara00000000 0110000101100001
charα00000011 1011000111001110 10110001
Το κείμενο παριστάνεται με την κωδικοποίηση UTF-8.

Παράσταση αριθμών κινητής υποδιαστολής

ΤύποςΤιμήΔυαδική παράστασηΠαράσταση κειμένου
double-0.12510111111 11000000 00000000 00000000
00000000 00000000 00000000 00000000
00101101
00110000
00101110
00110001
00110010
00110101
double 12.566370614359173 10-7 00111110 10110101 00010101 00110111
00001111 10011001 11110110 11001011
00110001
00110010
00101110
00110101
00110110
00110110
00110011
00110111
00110000
00110110
00110001
00110100
00110011
00110101
00111001
00110001
00110111
00110011
01100101
00101101
00110111
(Ο τελευταίος αριθμός παριστάνει τη φυσική σταθερά μ0, τη διαπερατότητα του κενού, 4π 10-7. Το κείμενο παριστάνεται με την κωδικοποίηση UTF-8 και οι αριθμοί κινητής υποδιαστολής σύμφωνα με το πρότυπο IEEE 754-1985.)

Ομαδοποίηση δεδομένων

Η ομαδοποίηση στοιχείων μπορεί να γίνει:

Παράδειγμα: ομαδοποίηση πεδίων σταθερού μήκους

ΓΓΠΣ/ΑΑΔΕ: Αναλυτική γραμμή πωλήσεων (πελατών)
ΠΙΝΑΚΑΣ 3. Αναλυτική γραμμή πωλήσεων (στοιχεία πελατών)
(RECORD τύπου 2)
ΠΕΡΙΓΡΑΦΗ
ΠΕΔΙΟΥ
ΘΕΣΕΙΣ
ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΠΕΔΙΟΥ
Σημειώσεις
ΣΤΑΘΕΡΗ
ΤΙΜΗ
ΑΠΟ
ΕΩΣ
ΜΗΚΟΣ
ΤΥΠΟΣ
1
Τύπος Record (κωδικός)
1
1
1
Numeric
KENO
2
2
Α/Α
2
6
5
Numeric
KENO
KENO
3
ΑΦΜ πελάτη
7
15
9
Character
KENO
KENO
4
Επωνυμία πελάτη
16
42
27
Character
KENO
KENO
5
Επαγγελμα πελάτη
43
57
15
Character
KENO
KENO
61
Μη υπόχρεοι υποβολής(αγρότες, περιστασιακά απασχολούμενοι κλπ)
58
58
1
Character
0 (μηδέν)= υπόχρεος
1 (ένα) = μη υπόχρεος
KENO
7
Δ/νση / Πόλη πελάτη
59
68
10
Character
KENO
KENO
8
Δ/νση / Οδός πελάτη
69
84
16
Character
KENO
KENO
9
Δ/νση / Αριθμ πελάτη
85
87
3
Character
KENO
KENO
10
Ταχ. Κώδικας πελάτη
88
92
5
Numeric
KENO
KENO
113
Αριθμός τιμολογίων (πλήθος)
93
99
7
Numeric
KENO
KENO
12
Καθαρή αξία τιμολογίων
100
115
16
Numeric
KENO
KENO
13
FILLER
116
150
35
Character
KENO
spaces

Παράδειγμα: ομαδοποίηση πεδίων με διαχωριστικό

Αρχείο /etc/passwd στο λειτουργικό σύστημα Unix

root:*:0:0:Charlie Root:/root:/bin/csh
dds:*:1000:1000:Diomidis Spinellis:/home/dds:/usr/local/bin/bash
nutmon:*:1056:1056:NUT UPS monitor unprivileged user:/nonexistent:/usr/sbin/nologin
sgrig:*:1001:1001:Stavros Grigorakakis:/home/sgrig:/usr/local/bin/bash
archie:*:1002:1002:Achilleas Anagnostopoulos:/home/archie:/usr/local/bin/bash
path:*:1003:1003:Stephanos Androutselis:/home/path:/usr/local/bin/bash

Τιμοκατάλογος της Microsoft (CSV)

Product Description,1st AP Non-Platform,1st AP Platform,2nd AP Non-Platform,2nd AP Platform,3rd AP Non-Platform,3rd AP Platform,Non-Platform,Platform,,,,,,,
OFFICE FAMILY,,,,,,,,,,
Office Enterprise Listed Lic/SA Pack MVL,76J-01468,76J-01637, 190.31 , 161.77 , 190.31 , 161.77 , 190.31 , 161.77 ,,
Office Enterprise Listed SA MVL,76J-01552,76J-01640, 98.96 , 94.02 , 98.96 , 94.02 , 98.96 , 94.02 ,,
Office Enterprise Listed SA Step Up MVL from Office Pro,76J-01510,76J-00002, 34.51 , 29.33 , 34.51 , 29.33 , 34.51 , 29.33 ,,,,,,,
Office Professional Plus Listed Lic/SA Pack MVL,269-05924,269-12441, 155.81 , 132.45 , 155.81 , 132.45 , 155.81 , 132.45 ,,,,,,,
Office Professional Plus Listed SA MVL,269-05925,269-12444, 81.02 , 76.97 , 81.02 , 76.97 , 81.02 , 76.97 ,,,,,,,
WINDOWS FAMILY,,,,,,,,,,,,,,,
Windows Vista Business Listed Upg/SA Pack MVL w/VisEnterprise,66J-00588,66J-00579, 48.01 , 40.81 , 48.01 , 40.81 , 48.01 , 40.81 ,,,,,,,
Windows Vista Business Listed SA MVL w/VisEnterprise,66J-00844,66J-00582, 31.76 , 30.17 , 31.76 , 30.17 , 31.76 , 30.17 ,,,,,,,

Ανάγνωση δυαδικών δεδομένων

Αυτόματη αποδέσμευση πόρων

Παράδειγμα: ανάγνωση byte

import java.io.*;

/**
 * Count and display the number of bytes in the specified file
 * @author Diomidis Spinellis
 */
class ByteCount {
    public static void main(String args[]) {
	if (args.length != 1) {
	    System.err.println("Usage: ByteCount file");
	    System.exit(1);
	}

	// Try with resources; will auto-close in
	try (var in = new BufferedInputStream(new FileInputStream(args[0]))) {

            // Count bytes
            int count = 0;
	    int b;
	    while ((b = in.read()) != -1)
		count++;

            System.out.println(count);
	} catch (FileNotFoundException e) {
	    System.err.println("Unable to open file " + args[0] + ": " + e.getMessage());
	    System.exit(1);
	} catch (IOException e) {
	    System.err.println("Error reading byte: " + e.getMessage());
	    System.exit(1);
	}

    }
}

Εγγραφή δυαδικών δεδομένων

Παράδειγμα: εγγραφή εικόνας

import java.io.*;

/**
 * Create a 256*256 24-bit color PNM RGB file containing all combinations
 * of R and G.
 * @author Diomidis Spinellis
 */
class ColorWrite {

    /** Write the specified ASCII string to out as bytes */
    static void writeStringAsBytes(OutputStream out, String s) throws IOException {
        for (int i = 0; i < s.length(); i++)
                out.write((byte)s.charAt(i));
    }

    public static void main(String args[]) {
	final String fileName = args[0];

	// Open file; try with resources
	try (var out =
                new BufferedOutputStream(new FileOutputStream(fileName))) {
            // NetPBM PPM 24-bit color file header
            // https://netpbm.sourceforge.net/doc/ppm.html
            writeStringAsBytes(out, "P6 256 256 255 ");
	    for (int r = 0; r < 256; r++)
		for (int g = 0; g < 256; g++) {
		    out.write(r);
		    out.write(g);
		    out.write(0);
		}
	} catch (FileNotFoundException e) {
	    System.err.println("Unable to open file " + fileName
		+ ": " + e.getMessage());
	    System.exit(1);
	} catch (IOException e) {
	    System.err.println("Error writing byte: " + e.getMessage());
	    System.exit(1);
	}
    }
}

Παράδειγμα: αρχείο PNG

PNG file format

Ανάγνωση χαρακτήρων

Παρένθεση: κωδικοποίηση ελληνικών χαρακτήρων

Στη Java μπορούμε να επεξεργαστούμε αρχεία με ελληνικούς χαρακτήρες με βάση τα παρακάτω ονόματα κωδικοποίησης της κλάσης Charset.

Διαθέσιμες κωδικοποιήσεις

Το παρακάτω πρόγραμμα τυπώνει όλες τις διαθέσιμες κωδικοποιήσεις.
import java.nio.charset.Charset;
import java.util.SortedMap;

/**
 * List the available character set encodins.
 * @author Diomidis Spinellis
 */
class ListCharset {
    public static void main(String args[]) {
        SortedMap<String,Charset> ac = Charset.availableCharsets();

        for (String k : ac.keySet())
            System.out.println(k);
    }
}

Παράδειγμα: κατηγοριοποίηση χαρακτήρων

import java.io.*;
import java.util.*;
import java.lang.Character.UnicodeBlock;

/**
 * Count and display for the specified input file
 * the number of characters contained in various Unicode blocks .
 * @author Diomidis Spinellis
 */
class CharCount {
    public static void main(String args[]) {
	if (args.length != 2) {
	    System.err.println("Usage: CharCount file encoding");
	    System.exit(1);
	}

	// Open file; try-with-resources
	try (var in = new BufferedReader(new InputStreamReader(
                        new FileInputStream(args[0]), args[1]))) {

            // Count characters in blocks
            var count = new HashMap<Character.UnicodeBlock, Integer>();
	    int c;
	    while ((c = in.read()) != -1) {
		var u = Character.UnicodeBlock.of(c);
		    Integer oldN = count.get(u);
		    if (oldN == null)
			count.put(u, 1);
		    else
			count.put(u, oldN + 1);
	    }

            // Display results
            for (var s : count.entrySet())
                System.out.println(s.getKey() + ": " + s.getValue());
	} catch (FileNotFoundException e) {
	    System.err.println("Unable to open file " + args[0] + ": " + e.getMessage());
	    System.exit(1);
	} catch (UnsupportedEncodingException e) {
	    System.err.println("Unsupported encoding " + args[1] + ": " + e.getMessage());
	} catch (IOException e) {
	    System.err.println("Error reading character: " + e.getMessage());
	    System.exit(1);
	}

    }
}

Εγγραφή χαρακτήρων

E/E συμβολοσειρών, πινάκων· σωληνώσεις

Είσοδο και έξοδο μπορούμε να πραγματοποιήσουμε επιπλέον μέσω:

Σειριακοποίηση αντικειμένων

Δόκιμες λύσεις φύλαξης αντικειμένων

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

Ανακεφαλαίωση σειριακής πρόσβασης

Ανάγνωση Εγγραφή
byte FileInputStream FileOutputStream
buffered byte BufferedInputStream BufferedOutputStream
int/double/… DataInputStream DataOutputStream
Object ObjectInputStream ObjectOutputStream
char InputStreamReader OutputStreamWriter
line(char) BufferedReader BufferedWriter
PrintWriter

Αρχεία τυχαίας πρόσβασης

Η διεπαφή NIO

H Java προσφέρει την διεπαφή προγραμματισμού (API) ΝΙΟ (New I/O) για πρόσβαση σε αρχεία όταν έχουμε ιδιαίτερα υψηλές απαιτήσεις απόδοσης. Σε σχέση με τη διεπαφή IO αυτή προσφέρει:

Πρόσβαση στο σύστημα αρχείων

Η κλάση File παρέχει πρόσβαση στη δομή με μεθόδους όπως τις παρακάτω:
exists
Ελέγχει την ύπαρξη ενός αρχείου.
delete
Διαγράφει ένα αρχείο.
lastModified
Επιστρέφει το χρόνο της τελευταίας αλλαγής στο αρχείο.
renameTo
Μετονομάζει ένα αρχείο
length
Επιστρέφει το μήκος ενός αρχείου
list
Επιστρέφει τα αρχεία που βρίσκονται σε ένα φάκελο.
mkdir
Δημιουργεί ένα νέο φάκελο
getFreeSpace
Επιστρέφει τον ελεύθερο χώρο στο δίσκο.

Άσκηση: επεξεργασία αρχείου κειμένου

Άσκηση 8

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

Βιβλιογραφία

Παράρτημα: Παράσταση ελληνικών χαρακτήρων

ΧαρακτήραςUnicodeISO 8859-7CP 1253CP 737CP 851Mac GreekCP 423CP 869ISO IR-19ISO IR-27ISO IR-88ISO IR-18ISO IR-150ISO IR-55
Ά0386b6a2ea86cd7186      
Έ0388b8b8eb8dce728d      
Ή0389b9b9ec8fd7738f      
Ί038ababaed90d87590      
Ϊ03aadada  ab 91      
Ό038cbcbcee92d97692      
Ύ038ebebeef95da7795      
Ϋ03abdbdb  bd 96      
Ώ038fbfbff098df7898      
Α0391c1c180a4b041a461 41614141
Β0392c2c281a5b542a562 42624242
Γ0393c3c382a6a143a6672343674344
Δ0394c4c483a7a244a7644044644445
Ε0395c5c584a8b645a865 45654546
Ζ0396c6c685a9b746a97a 467a4649
Η0397c7c786aab847aa68 4768474a
Θ0398c8c887aca348ac755c4875484b
Ι0399c9c988adb949ad69 4969494c
Κ039acaca89b5ba51b56b 4b6b4a4d
Λ039bcbcb8ab6a452b66c5e4c6c4b4e
Μ039ccccc8bb8bb53b76d 4d6d4c4f
Ν039dcdcd8cb7c154b86e 4e6e4d50
Ξ039ecece8dbda555bd6a214f6a4e51
Ο039fcfcf8ebec356be6f 506f4f52
Π03a0d0d08fc6a657c6703f51705053
Ρ03a1d1d190c7c458c772 52725155
Σ03a3d3d391cfaa59cf735f53735356
Τ03a4d4d492d0c662d074 54745458
Υ03a5d5d593d1cb63d179 55795559
Φ03a6d6d694d2bc64d2665d5666565a
Χ03a7d7d795d3cc65d378 5878575b
Ψ03a8d8d896d4be66d4633a5963585c
Ω03a9d9d997d5bf67d5765b5a76595d
ά03acdcdce19bc0b19b      
έ03addddde29ddbb29d      
ή03aededee39edcb39e      
ί03afdfdfe59fddb59f      
ϊ03cafafae4a0fbb4a0      
ΐ0390c0c0 a1fd a1      
ό03ccfcfce6a2deb6a2      
ύ03cdfdfde7a3e0b7a3      
ϋ03cbfbfbe8fbfcb8fb      
ΰ03b0e0e0 fcfe fc      
ώ03cefefee9fdf1b9fd      
α03b1e1e198d6e18ad6  61416161
β03b2e2e299d7e28bd7  62426262
γ03b3e3e39ad8e78cd8  63476364
δ03b4e4e49bdde48ddd  64446465
ε03b5e5e59cdee58ede  65456566
ζ03b6e6e69de0fa8fe0  665a6669
η03b7e7e79ee1e89ae1  6748676a
θ03b8e8e89fe2f59be2  6855686b
ι03b9e9e9a0e3e99ce3  6949696c
κ03baeaeaa1e4eb9de4  6b4b6a6d
λ03bbebeba2e5ec9ee5  6c4c6b6e
μ03bcececa3e6ed9fe6  6d4d6c6f
ν03bdededa4e7eeaae7  6e4e6d70
ξ03beeeeea5e8eaabe8  6f4a6e71
ο03bfefefa6e9eface9  704f6f72
π03c0f0f0a7eaf0adea  71507073
ρ03c1f1f1a8ebf2aeeb  72527175
ς03c2f2f2aaedf7afed  77577277
σ03c3f3f3a9ecf3baec  73537376
τ03c4f4f4abeef4bbee  74547478
υ03c5f5f5acf2f9bcf2  75597579
φ03c6f6f6adf3e6bdf3  7646767a
χ03c7f7f7aef4f8bef4  7858777b
ψ03c8f8f8aff6e3bff6  7943787c
ω03c9f9f9e0faf6dbfa  7a56797d

Παράρτημα: το πρότυπο ASCII

Ο παρακάτω πίνακας παρουσιάζει τις τιμές των χαρακτήρων, σύμφωνα με το πρότυπο ASCII (American Standard Code for Information Interchange). Οι πρώτες 32 θέσεις δεσμεύονται για χαρακτήρες διαφυγής (escape character).
ΧαρακτήραςΔεκαδικήΔεκαεξαδικήΟκταδικήΔυαδική
nul0000000000 0000
soh1010010000 0001
stx2020020000 0010
etx3030030000 0011
eot4040040000 0100
enq5050050000 0101
ack6060060000 0110
bel7070070000 0111
bs8080100000 1000
ht9090110000 1001
lf100a0120000 1010
vt110b0130000 1011
ff120c0140000 1100
cr130d0150000 1101
so140e0160000 1110
si150f0170000 1111
dle16100200001 0000
dc117110210001 0001
dc218120220001 0010
dc319130230001 0011
dc420140240001 0100
nak21150250001 0101
syn22160260001 0110
etb23170270001 0111
can24180300001 1000
em25190310001 1001
sub261a0320001 1010
esc271b0330001 1011
fs281c0340001 1100
gs291d0350001 1101
rs301e0360001 1110
us311f0370001 1111
sp32200400010 0000
!33210410010 0001
"34220420010 0010
#35230430010 0011
$36240440010 0100
%37250450010 0101
&38260460010 0110
'39270470010 0111
(40280500010 1000
)41290510010 1001
*422a0520010 1010
+432b0530010 1011
,442c0540010 1100
-452d0550010 1101
.462e0560010 1110
/472f0570010 1111
048300600011 0000
149310610011 0001
250320620011 0010
351330630011 0011
452340640011 0100
553350650011 0101
654360660011 0110
755370670011 0111
856380700011 1000
957390710011 1001
:583a0720011 1010
;593b0730011 1011
<603c0740011 1100
=613d0750011 1101
>623e0760011 1110
?633f0770011 1111
@64401000100 0000
A65411010100 0001
B66421020100 0010
C67431030100 0011
D68441040100 0100
E69451050100 0101
F70461060100 0110
G71471070100 0111
H72481100100 1000
I73491110100 1001
J744a1120100 1010
K754b1130100 1011
L764c1140100 1100
M774d1150100 1101
N784e1160100 1110
O794f1170100 1111
P80501200101 0000
Q81511210101 0001
R82521220101 0010
S83531230101 0011
T84541240101 0100
U85551250101 0101
V86561260101 0110
W87571270101 0111
X88581300101 1000
Y89591310101 1001
Z905a1320101 1010
[915b1330101 1011
\925c1340101 1100
]935d1350101 1101
^945e1360101 1110
_955f1370101 1111
`96601400110 0000
a97611410110 0001
b98621420110 0010
c99631430110 0011
d100641440110 0100
e101651450110 0101
f102661460110 0110
g103671470110 0111
h104681500110 1000
i105691510110 1001
j1066a1520110 1010
k1076b1530110 1011
l1086c1540110 1100
m1096d1550110 1101
n1106e1560110 1110
o1116f1570110 1111
p112701600111 0000
q113711610111 0001
r114721620111 0010
s115731630111 0011
t116741640111 0100
u117751650111 0101
v118761660111 0110
w119771670111 0111
x120781700111 1000
y121791710111 1001
z1227a1720111 1010
{1237b1730111 1011
|1247c1740111 1100
}1257d1750111 1101
~1267e1760111 1110
del1277f1770111 1111

Περιεχόμενα