Java - Operatii de Intrare/iEsire (I/E)

Download Report

Transcript Java - Operatii de Intrare/iEsire (I/E)

C12 – LPO: Operatii de
Intrare/iEsire cu fisiere
CUPRINS
Fisiere
Fluxuri






pe octet
pe caracter
Serializare
Tokenizer (analiza lexicala)
Obiective
După parcurgerea acestui curs ar trebuie sa puteţi:
 înţelege principiile de lucru fisiere si fluxuri in
Java;
 manipula date date prin fluxuri pe caracter si
octer;
 serializa obiecte prin fluxuri;
 realiza analiza lexicala a datelor stocate in fisiere.
Fisiere Java


fişierul este o structura de date ce asigura pastrarea
permanenta (persistenta) datelor;
datele sunt stocate utilizând doua formate:





text (caracter) : ‘a’ ‘b’ ‘1’ ‘2’ ….
binar (octeti): 0 12 48 63 …
în Java fişierele sunt fluxuri de caractere sau de
octeti
fluxul este abstractizarea pentru orice se poate citi
sau scrie;
clasele de fluxuri (Stream) se folosesc la
manipularea de octeti, clasele Reader si Writer
citesc si scriu caractere.
Fluxuri




operatiile de intrare/ieşire pe fluxuri au la baza patru clase
abstracte: InputStream, OutputStream, Reader şi Writer;
pe baza acestora se creeaza mai multe clase concrete, de
aplicatiile opereaza cu clase concrete, cele abstracte
definesc functonalitatea comuna tuturor claselor din acea
categorie;
InputStream şi OutputStream se folosesc în cazul
fluxurilor de octeti, iar Reader şi Writer se folosesc în
cazul fluxurilor de caractere;
fluxurile pe caracter se folosesc în cazul caracterelor şi a
şirurilor de caractere, iar cele pe octet în cazul octetilor sau
a obiectelor binare.
Fisiere externe si directori


un obiect din clasa File se foloseste pentru manipularea de fisiere si
directori (la nivelul sistemului de operare);
crearea unui fisier extern si director se fac prin:
File f = new File(“nume.txt”);
f.createNewFile();

stergerea unui fisier sau director (se poate sterge doar daca e vid):
f.delete();

redenumirea unui fisier sau director:
f.renameTo();

File d = new File(“dir1);
d.mkdir();
alte metode:




f.getName():
f.getPath():
f.isFile() sau f.isDirectory()
f.canRead() sau f.canWrite():
Clase de fluxuri pe octet
ByteArrayInputStream
DataInputStream
FileInputStream
FilterInputStream
InputStream
SequenceInputStream
DataInput
BufferedInputStream
LineNumberInputStream
PushBackInputStream
PipedInputStream
ObjectInputStream
Object
ObjectInput
StringBufferInputStream
ByteArrayOutputStream
FileOutputStream
OutputStream
FilterOutputStream
PipedOutputStream
ObjectOutputStream
RandomAccessFile
BufferedOutputStream
DataOutputStream
PrintStream
ObjectOutput
DataOutput
FileInputStream si
FileOutputStream


FileInputStream creeaza un InputStream ce se poate folosi pentru
citirea de octeti din fisier;
FileOutputStream creeaza un OutputSteam ce se poate folosi
pentru scrierea de octeti in fisier;
import java.io.*;
public class ByteStreamIO {
public static void main(String[] args) {
int nroct = 0;
int iout = 2807;
byte[] bout = new byte[2];
try {
FileOutputStream scriebin = new FileOutputStream("out.bin");
//transformat int-ul in byte-uri
bout[0] = (byte)(iout / 256); //10
bout[1] = (byte)(iout % 256); //247
scriebin.write(bout);
scriebin.close();
FileInputStream citestebin = new FileInputStream("out.bin");
nroct = citestebin.available();
System.out.println(nroct + " octeti.");
if (nroct > 0) {
FileInputStream si
FileOutputStream
for (int i = 0; i < nroct; i++)
System.out.println(citestebin.read());
/* se poate si asa desi numarul
* de octeti se cunoaste
while ((bin = (byte)citestebin.read()) != -1)
System.out.println((int) bin);
*/
}
citestebin.close();
} catch (FileNotFoundException n) {
System.err.println("Nu pot lucra cu fiserul!");
} catch (IOException e) {
System.err.println("Eroarea de I/E: " + e);
}
}
Clase de fluxuri pe caractere
CharArrayReader
InputStreamReader
FilterReader
Reader
FileReader
PushBackReader
StringReader
PipedReader
BufferedReader
Object
LineNumberReader
BufferedWriter
CharArrayWriter
OutputStreamWriter
Writer
FilterWriter
PipedWriter
PrintWriter
StringWriter
StreamTokenizer
FileWriter
FileReader si FileWriter


FileWriter creeaza un Writer ce se poate folosi pentru scrierea de
caractere in fisier;
FileReader creeaza un Reader ce se poate folosi pentru citirea de
caratere din fisier;
import java.io.*;
public class CharStreamIO {
public static void main(String[] args) {
String s = "2807";
int nroct = 0, in;
try {
FileWriter scrietxt = new FileWriter("out.txt");
for(int i=0; i<s.length();++i)
scrietxt.write(s.charAt(i));
/* se poate scrie direct tot sirul cu:
scrietxt.write(s);
*/
scrietxt.flush(); // inainte de close nu e necesar
scrietxt.close();
FileReader citestetxt = new FileReader("out.txt");
FileReader si FileWriter
while ((in = citestetxt.read()) != -1) {
System.out.println((char)in);
nroct++;
}
citestetxt.close();
} catch (IOException e) {
System.out.println("Eroarea de I/E: " + e);
}
}
}
Serializare




fluxurile de obiecte permit operatii de intrare si iesire la nivel
de obiect;
pentru ca un obiect sa poata fi scris sau citit, clasa ce
defineste obiectul trebuie sa implementeze interfata
java.io.Serializable (sau java.io.Externalizable);
interfata Serializable are rol de marcare, nu are metode, deci
nu se scrie cod aditional in clasa ce implementeaza
Serializable;
implementarea interfetei premite ca mecanismul de serializare
Java sa automatizeze procesul de stocare al obiectelor sau
tablourilor.
Interfata Serializable
import java.io.Serializable;
public class Punct
//Campuri
private double
private double
private double
implements Serializable{
public double x() {
return x;
}
x;
y;
distanta;
public double y() {
return y;
}
//Constructori
Punct() {
setX(0);
setY(0);
distanta = 0;
}
Punct(double x, double y) {
setX(x);
setY(y);
actualizareDistanta();
}
// Metode
public void setX(double x) {
this.x = x;
actualizareDistanta();
}
public void setY(double y) {
this.y = y;
actualizareDistanta();
}
public double distantaOrigine() {
return distanta;
}
private void actualizareDistanta() {
distanta = Math.sqrt(x*x+y*y);
}
public String toString() {
return "<" + x + "," + y + ">";
}
}
Interfata Serializable
import java.io.*;
public class TestSerializare {
public static void main(String[] args) {
Punct p1 = new Punct(1,1);
Punct[] puncte = new Punct[3];
puncte[0]=p1;
puncte[1]= new Punct(2,2);
puncte[2]= new Punct(3,3);
ObjectOutputStream out;
ObjectInputStream in;
try {
out = new ObjectOutputStream(new FileOutputStream("obiecte.dat"));
out.writeObject(puncte);
out.close();
in = new ObjectInputStream(new FileInputStream("obiecte.dat"));
Punct [] punctecitie = (Punct []) in.readObject();
in.close();
for (Punct p: punctecitie)
System.out.println(p);
} catch (Exception e) { e.printStackTrace(); }
}
}
Stream si String Tokenizer

SteamTokenizer formeaza atomi lexicali de pe InputStream
delimitati prin anumite multimi de caractere, lucreaza similar cu
StringTokenizer.
import java.io.*;
import java.util.StringTokenizer;
public class LineTokenStreamIO {
public static void main(String[] args) {
int l = 0;
String linie = null;
PrintWriter fout = null;
BufferedReader fin = null;
String s;
int x;
double y1, y2;
try {
fout = new PrintWriter(new FileWriter("linefile.txt"));
//scrierea datelor in fisier, separatorul este ","
for (int i = 0; i < 5; ++i)
fout.println("Linia " + (i + 1) + "," + i + "," + Math.sin(i) +
"," + Math.cos(i));
fout.close();
fin = new BufferedReader(new FileReader("linefile.txt"));
while ((linie = fin.readLine()) != null) {
System.out.println("S-a citit linia: "+linie);
//extragerea simbolurilor pe baza separatorului ,
StringTokenizer t = new StringTokenizer(linie,",");
s = t.nextToken();
x = Integer.parseInt(t.nextToken());
y1 = Double.parseDouble(t.nextToken());
y2 = Double.parseDouble(t.nextToken());
System.out.println(s+x+y1+y2);
++l;
}
System.out.println("S-au citit si prelucrat" + l + " linii");
fin.close();
} catch (IOException e) {
}
}
}
Intrebari
1.
2.
3.
4.
5.
Ce este persistenta datelor, cum se ajunge la aceasta prin
fisiere?
Cate clase abstracte pentru lucrul cu fluxuri sunt in Java si
cand se folosesc acestea?
Cu ce clasa se manipuleaza sistemul de fisiere (al
sistemului de operare), ce operatii sunt posibile?
Ce presupune procesul de serializare al unei clase si ce
effort de implementare necesita?
Ce este o clasa Tokenizer?
Bibliografie
1.
2.
3.
4.
5.
6.
http://www.oracle.com/technetwork/java/javase/documenta
tion/index.html
http://docs.oracle.com/javase/6/docs/
Ştefan Tanasă, Cristian Olaru, Ştefan Andrei, Java de la 0
la expert, Polirom, 2003, ISBN: 973-681-201-4.
Herber Schild, Java 2 - The Complete Reference, Fourth
Edition, Osborne, 2001, ISBN: 0-07-213084-9.
Deitel H.M., Deitel P. J., Java - How to programm, Fith
Edition, Prentice Hall, 2003, ISBN: 0-13-120236-7.
http://www.east.utcluj.ro/mb/mep/antal/downloads.html