Vom analiza mai jos clasele Java care permit operarea cu fluxurile de caractere
- FileReader
- FileWriter
- BufferedReader
- BufferedWriter
Clasa FileReader este utilizată pentru citirea caracterelor dintr-un fișier text. Pentru a putea folosi această clasă, trebuie mai întâi să creăm un obiect FileReader, iar acest lucru se face prin constructori.
Clasa FileReader are doi constructori principali:
- FileReader(String cale)- primește ca parametru calea către fișier, sub formă de text, String. Programul deschide fișierul respectiv pentru citire.
- FileReader(File fisier)- primește ca parametru un obiect de tip File care reprezintă fișierul ce trebuie citit. Mai întâi se creează obiectul File, iar apoi acesta este transmis constructorului FileReader.
// varianta 1FileReader fr1 = new FileReader("text.txt");
// varianta 2
File f = new File("text.txt");FileReader fr2 = new FileReader(f);
- read() - citește un caracter din fișier
- close() - închide fișierul, fluxul de intrare deschis
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\documente\\TestFile1.txt");
int c;
while ((c = fr.read()) != -1) {
System.out.print((char)c);
}
fr.close();
}}
import java.io.*;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\documente\\TestFile1.txt");
Scanner sc = new Scanner(fr);
while (sc.hasNextLine()) {
String linie = sc.nextLine();
System.out.println(linie);
}
sc.close();
fr.close();
}}
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("D:\\documente\\TestFile1.txt");
Scanner sc = new Scanner(fr);
System.out.println("Fisierul contine valorile");
while (sc.hasNextInt()) {
int numar = sc.nextInt();
System.out.print(numar + " ");
}
sc.close();
fr.close();
}}
Clasa BufferedReader este utilizată pentru citirea eficientă a textului din fișiere. Aceasta folosește un buffer (memorie temporară) pentru a accelera citirea. Cel mai mare avantaj este metoda readLine(), care citește o linie întreagă. Constructorii clasei sunt:
- BufferedReader(Reader in) - creează un obiect BufferedReader care citește date dintr-un flux de caractere (Reader). În practică, cel mai des se folosește împreună cu FileReader pentru citirea unui fișier text. Cel mai utilizat constructor.
Exemplu: BufferedReader br = new BufferedReader(new FileReader("text.txt"));
- BufferedReader(Reader in, int dimBuffer)- acest constructor permite specificarea dimensiunii bufferului (memoria temporară utilizată pentru citire) la instanțiere. Reader in este fluxul de caractere din care se citește, iar dimBuffer este dimensiunea bufferului (numărul de caractere).
Exemplu: BufferedReader br = new BufferedReader(new FileReader("text.txt"), 1024);
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\documente\\TestFile1.txt"));
String linie;
while ((linie = br.readLine()) != null) {
System.out.println(linie);
}
br.close();
}}
- Integer.parseInt() - convertește stringul citit în int
- Double.parseDouble() - convertește stringul citit în double
- Float.parseFloat() - convertește stringul citit în float
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\documente\\TestFile1.txt"));
String linie;
while ((linie = br.readLine()) != null) {
int numar = Integer.parseInt(linie);
System.out.println(numar);
} br.close();
}}
Exemplu 6. Citirea datelor din fișier folosind clasa FileReader și BufferedReader în cazul în care pe fiecare linie se află mai multe valori.
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\documente\\TestFile1.txt"));
String linie;
while ((linie = br.readLine()) != null) {
String[] numere = linie.split(" ");
for (String n : numere) {
int numar = Integer.parseInt(n);
System.out.println(numar);
}}
br.close();
}}
BufferedReader nu citește direct numere, ci text. De aceea citirea numerelor din fișiere, în practică este mai simplu să folosim Scanner, deoarece el poate citi direct numere (nextInt(), nextDouble()), fără conversii.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(new FileReader("D:\\documente\\TestFile1.txt"));
while (sc.hasNext()) {
int id = sc.nextInt();
String nume = sc.next();
String prenume = sc.next();
System.out.println("ID: " + id +
" Nume: " + nume +
" Prenume: " + prenume);
} sc.close();
}}
Exemplu 8. Citirea datelor din fișier folosind clasa FileReader și BufferedReader în cazul în care pe fiecare linie se află mai multe valori de diferite tipuri. Cum ar fi int, String și String:
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\documente\\TestFile1.txt"));
String linie;
while ((linie = br.readLine()) != null) {
String[] date = linie.split("\\s+");
int id = Integer.parseInt(date[0]);
String nume = date[1];
String prenume = date[2];
System.out.println("ID: " + id +" Nume: " + nume + " Prenume: " + prenume);
}
br.close();
}}
- FileWriter(String fileName) - creează un fișier sau îl deschide dacă există. Dacă fișierul există, suprascrie conținutul.
- FileWriter(String fileName, boolean append) - la fel ca primul constructor, doar că al doilea parametru true înseamnă că se adaugă la sfârșitul fișierului (append). Astfel că, la conținutul deja existent în fișier se adaugă noua informație. Valoarea false sau lipsa celui de al doilea parametrul va suprascrie fișierul.
- FileWriter(File file) - Primește un obiect File în loc de șir. Comportament similar primului constructor, suprascrie fișierul dacă există.
- FileWriter(File file, boolean append) - Primește un obiect File în loc de șir. Pentru valoara true în cel de al doilea parametru va efectua anexarea datelor în fișier păstrând conținutul anterior.
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
String propozitie = "Aceasta este o propoziție scrisă în fișier.";
FileWriter fw = new FileWriter("D:\\documente\\Propozitie.txt");
fw.write(propozitie);
fw.close();
System.out.println("Propoziția a fost scrisă cu succes!");
}}
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.println ("Ce ID? ");
int id = in.nextInt();
System.out.println ("Ce nume? ");
String nume = in.next();
System.out.println ("Ce prenume? ");
String prenume = in.next();
FileWriter fw = new FileWriter("D:\\documente\\Date.txt");
fw.write(id + " " + nume + " " + prenume + "\n");
System.out.println("Datele au fost scrise cu succes în fișier!");
fw.close(); in.close();
}}
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
try (Scanner in = new Scanner(System.in);
FileWriter fw = new FileWriter("D:\\documente\\Date.txt")) {
System.out.print("Ce ID? ");
int id = in.nextInt();
System.out.print("Ce nume? ");
String nume = in.next();
System.out.print("Ce prenume? ");
String prenume = in.next();
fw.write(id + " " + nume + " " + prenume + "\n");
System.out.println("Datele au fost scrise cu succes în fișier!");
} catch (IOException e) {
System.out.println("Eroare la scrierea fișierului: " + e.getMessage());
}}}
- BufferedWriter(Writer out) - creează un BufferedWriter care scrie în fișierul specificat prin Writer. Folosește dimensiunea implicită a bufferului (~8192 caractere).
Exemplu: FileWriter fw = new FileWriter("D:\\documente\\Date.txt");
BufferedWriter bw = new BufferedWriter(fw);
- BufferedWriter(Writer out, int sz) - creează un BufferedWriter cu un buffer personalizat de sz caractere. Poate fi util pentru fișiere foarte mari sau scrieri frecvente.
Exemplu: FileWriter fw = new FileWriter("D:\\documente\\Date.txt");
BufferedWriter bw = new BufferedWriter(fw, 4096);
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
Scanner in = new Scanner(System.in);
System.out.print("Ce ID? ");
int id = in.nextInt();
System.out.print("Ce nume? ");
String nume = in.next();
System.out.print("Ce prenume? ");
String prenume = in.next();
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\documente\\Date.txt"));
bw.write(id + " " + nume + " " + prenume);
bw.newLine(); // adaugă linie nouă
System.out.println("Datele au fost scrise cu succes în fișier!");
bw.close();
in.close();
}}