Citirea și scrierea fișierelor text
Deși clasele discutate anterior pot fi utilizate pentru a scrie text în fișiere, acestea sunt concepute în principal pentru lucrul cu fluxuri de date binare, iar funcționalitatea lor nu este suficientă pentru o gestionare completă a fișierelor text. În acest scop, există alte clase care sunt moștenitoare ale claselor abstracte Reader și Writer.
Scrierea fișierelor - Clasa FileWriter
Clasa FileWriter este derivată din clasa Writer și este utilizată pentru a scrie fișiere text.
Pentru a crea un obiect FileWriter, se pot folosi următorii constructori:
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
Constructorul primește fie o cale către fișier sub formă de șir de caractere, fie un obiect File care se referă la un fișier text specific. Parametrul append indică dacă datele trebuie adăugate la sfârșitul fișierului (dacă este true), sau dacă fișierul trebuie rescris complet.
Exemplu de scriere într-un fișier:
import java.io.*;
public class Program {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("notes3.txt", false)) {
// scrierea întregului șir
String text = "Hello Gold!";
writer.write(text);
// scrierea caracterelor individuale
writer.append('\n');
writer.append('E');
writer.flush();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
În acest caz, parametrul append are valoarea false, ceea ce înseamnă că fișierul va fi rescris. Apoi, cu ajutorul metodelor definite în clasa de bază Writer, se efectuează scrierea datelor.
Citirea fișierelor - Clasa FileReader
Clasa FileReader este moștenită din clasa abstractă Reader și oferă funcționalități pentru citirea fișierelor text.
Pentru a crea un obiect FileReader, se pot folosi următorii constructori:
FileReader(String fileName)
FileReader(File file)
FileReader(FileDescriptor fd)
Apoi, folosind metodele definite în clasa de bază Reader, putem citi fișierul:
import java.io.*;
public class Program {
public static void main(String[] args) {
try (FileReader reader = new FileReader("notes3.txt")) {
// citire caracter cu caracter
int c;
while ((c = reader.read()) != -1) {
System.out.print((char) c);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
De asemenea, putem citi datele într-un buffer intermediar, utilizând un tablou de caractere:
import java.io.*;
import java.util.Arrays;
public class Program {
public static void main(String[] args) {
try (FileReader reader = new FileReader("notes3.txt")) {
char[] buf = new char[256];
int c;
while ((c = reader.read(buf)) > 0) {
if (c < 256) {
buf = Arrays.copyOf(buf, c);
}
System.out.print(buf);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
În acest caz, citim secvențial caracterele din fișier într-un tablou de 256 de caractere, până ajungem la sfârșitul fișierului, caz în care metoda read returnează valoarea -1.
Deoarece porțiunea citită din fișier poate fi mai mică decât 256 de caractere (de exemplu, fișierul poate conține doar 73 de caractere), iar dacă numărul de date citite este mai mic decât dimensiunea bufferului, folosim metoda Arrays.copyOf pentru a tăia tabloul buf, păstrând doar caracterele citite efectiv din fișier.