Fluxuri de intrare/ieşire
0. Suprapunerea obiectelor
Fie clasa:
class A {
... met(...) { ... }
}
1. Schema generală
Clasele ce oferă facilităţi de intrare/ieşire se găsesc în pachetul java.io.
Facilităţile de intrare/ieşire din Java au la bază noţiunea de flux. Un flux este
un obiect asociat unei succesiuni de elemente (octeţi sau caractere), citite şi scrise
secvenţial.
Pentru un flux de intrare sursa datelor poate fi un fişier, dar şi un şir sau tablou
de octeţi, respectiv caractere. Pentru un flux de ieşire, datele transmise sunt stocate
într-un fişier sau într-un tablou de octeţi, respectiv caractere.
2
Dacă la citire nu sunt încă date disponibile în flux şi nu s-a detectat sfârşitul
datelor, atunci firul de executare care realizează citirea va fi blocat până când vor
exista date disponibile.
O primă clasificare a fluxurilor are în vedere elementele de bază care sunt
transmise: caractere sau octeţi.
Object
InputStream (clasă abstractă pt. citire la nivel de octet)
OutputStream (clasă abstractă pt. scriere la nivel de octet)
Reader (clasă abstractă pentru citire la nivel de caracter)
Writer (clasă abstractă pt. scriere la nivel de caracter)
Object
DataInput (interfaţă)
InputStream (clasă abstractă)
FileInputStream
FilterInputStream
DataInputStream implements DataInput
DataOutput (interfaţă)
OuputStream (clasă abstractă)
FileOutputStream
FilterOutputStream
DataOutputStream implements DataOutput
import java.io.*;
import java.util.*;
class Copiere {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.print("Fisier cerut: ");
String fisier = sc.next();
InputStream is = null;
try { is = new FileInputStream(fisier); }
catch(FileNotFoundException e) {
System.out.println("Fisier inexistent");
System.exit(0);
}
System.out.print("Numele copiei : ");
fisier = sc.next();
OutputStream os = new FileOutputStream(fisier);
int c = 123;
while( (c=is.read()) != -1) os.write(c);
System.out.println("\nFisier copiat!");
is.close(); os.close();
}
}
Interfaţa DataOutput
Conţine metode menite a scrie, într-un flux de ieşire neprecizat, date de tipuri
primitive, precum şi şiruri de caractere.
void write(int b)
void write(byte[] b) throws NullPointerException
void write(byte[] b, int init, int lung)
throws NullPointerException, IndexOutOfBoundsException
void writeBytes(String s) throws NullPointerException
void writeChars(String s) throws NullPointerException
void writeUTF(String s) void writeBoolean(boolean v)
void writeByte(int v) void writeShort(int v)
void writeChar(int v) void writeInt(int v)
void writeLong(long v) void writeFloat(float v)
void writeDouble(double v)
4
Interfaţa DataInput
Este "complementara" interfeţei DataOutput. Metodele citesc octeţi din
fluxul de intrare; pe baza acestor octeţi sunt reconstituite date de tipuri primitive sau
şiruri de caractere.
int skipBytes(int n) boolean readBoolean()
byte readByte() short readShort()
char readChar() int readInt()
long readLong() float readFloat()
double readDouble() String readLine()
String readUTF()
Observaţie. Dacă s-a ajuns la sfârşitul fluxului de intrare înainte de a se fi citit
numărul dorit de octeţi, va fi lansată excepţia EOFException.
Se presupune că datele citite au fost scrise în fişier cu metodele
complementare anunţate în interfaţa DataOutput.
Dacă dorim să scriem/citim tipuri primitive sau şiruri de caractere, vom folosi
clasele DataOutputStream şi DataInputStream.
dos.close();
}
}
unde:
- prin new FileOutputStream("out.dat") este creat fişierul out.dat;
- fluxul dos de tipul DataOutputStream foloseşte metodele writeInt şi
writeDouble (anunţate în interfaţa DataOutput şi implementate în clasa
DataOutputStream) pentru a scrie în fişierul out.dat;
- pentru închiderea fişierului este invocată metoda close a clasei
FilterInputStream (moştenită din DataOutputStream).
din care vom folosi numai clasa PrintWriter, care oferă facilitatea de a scrie date
în fluxul de ieşire într-un mod formatat, specific metodelor toString. Nu este
lansată niciodată excepţia IOException.
import java.io.*;
class Print {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("out");
PrintWriter out = new PrintWriter(fos);
PrintWriter stdout = new PrintWriter(System.out);
out.println("Cifrele zecimale sunt:");
for(int i=0; i<10; i++) out.print(i + "\t");
out.println();
stdout.println("Cifrele zecimale sunt:");
for(int i=0; i<10; i++) stdout.print(i + "\t");
stdout.println();
out.close(); // stdout.close();
}
}