laborator10.pdf

Upload: alex-serban

Post on 07-Jan-2016

218 views

Category:

Documents


0 download

TRANSCRIPT

  • ROMNIA

    Universitatea Politehnica din Bucuresti

    Facultatea de Antreprenoriat, Ingineria si Managementul Afacerilor

    Programarea Calculatoarelor - Laboratorul 10

    Responsabil: l.dr.ing. Bogdan ignoaia, [email protected]

    Obiectivele laboratorului sunt urmatoarele:

    Prezentarea operatiilor de intrare si de iesire

    Lucrul cu fisiere in Java Taskuri

    1. Prezentarea operatiilor de intrare si de iesire

    Operatii de intrare

    Operatiile de intrare-iesire (I/O - Input/Output) sunt indispensabile in orice limbaj de

    programare. In limbajul Java aceste operatii sunt implementate ca si functii de biblioteca in

    pachetul java.io. Ele se bazeaza pe conceptul de "stream" (flux de date). Un stream poate fi

    1

  • privit ca un canal de comunicatie in care un dispozitiv produce (scrie) date intr-un capat iar

    alt dispozitiv consuma (citeste) aceste date la capatul opus.

    Atentie: Toate fisierele care folosesc functii de intrare/iesire trebuie sa importe pachetul

    java.io.* (sau doar anumite clase din acesta).

    Atentie: Pentru a utiliza un stream, acesta trebuie deschis. Pentru a elibera resursele

    ocupate prin deschidere se recomanda inchiderea fluxului dupa folosire prin apelarea

    metodei close().

    Principalul avantaj al acestui concept este acela ca permite tratarea unitara a dispozitivelor

    de I/O.

    Relativ la modul de folosire al stream-urilor se pot identifica doua categorii: stream de

    intrare - Input Stream (extern -> memorie) si stream de iesire - Output Stream (memorie ->

    extern).

    Varietatea dispozitivelor cu care se poate comunica prin stream-uri este destul de mare dar

    exista doua dispozitive care se intalnesc in orice configuratie de calculator, din acest

    considerent numindu-se dispozitive standard: tastatura si monitorul. Pentru aceste

    dispozitive standard s-au creat doi membrii statici speciali chiar in clasa java.lang.System:

    System.in (tastatura), System.out (monitor). Acest lucru faciliteaza folosirea directa a

    acestor dispozitive. De regula fluxurile in si out nu se inchid prin close().

    In general toate functiile de I/O genereaza erori de tipul IOException. Din aceasta clasa de

    exceptii standard sunt derivate o serie de exceptii specializate:

    2

  • EOFException - se genereaza la intalnirea sfarsitului de fisier

    FileNotFoundException - se genereaza la incercarea de deschidere a unui fisier inexistent

    InterruptedIOException - se genereaza cand o operatie de intrare/iesire este intrerupta in

    timp ce se executa

    Pe langa operatiile de intrare de la tastatura, cele mai intalnite operatii de intrare au ca

    obiect citirea dintr-un fisier. Pentru fisiere clasele de I/O deriva din FileInputStream (derivat

    la randul sau din InputStream).

    Din punct de vedere fizic, printr-un stream circula doar octeti. Din punct de vedere logic

    insa, datele vehiculate pot fi interpretate ca fiind de tip text (caractere organizate pe linii de

    text) sau binare (siruri de numere).

    Citirea datelor dintr-un flux de intrare text (linii de text) se realizeaza de obicei printr-o clasa

    specializata, si anume prin BufferedReader (derivata din clasa java.io.Reader). Aceasta clasa

    are avantajul ca permite, pe langa citirea caracter cu caracter a fluxului text si citirea unor

    linii intregi.

    Pentru a realiza tratarea identica a tuturor intrarilor, o clasa de nivel superior (cum este

    BufferedReader) poate primi ca si suport un flux primar (ex. FileInputStream):

    Pentru citirea de la tastatura se va folosi constructia:

    BufferedReader flux_intrare = new BufferedReader(new InputStreamReader(System.in));

    Pentru citirea dintr-un fisier:

    3

  • BufferedReader flux_intrare = new BufferedReader(new

    InputStreamReader(new FileInputStream(numeFisier)));

    Dupa crearea unui obiect de tip BufferedReader, citirea din stream se poate realizeaza astfel:

    String linie;

    // declarare stream de intrare de tip BufferdReader

    BufferedReader flux_intrare = new BufferedReader( ... );

    try {

    while ((linie = flux_intrare.readLine()) != null)

    ... // prelucrare linie

    } catch (IOException e) {

    System.out.println(Eroare de citire date!);

    }

    flux_in.close();

    Task 1: Compilati si rulati urmatorul program

    import java.io.*;

    class Citire {

    public static void main(String[] args) throws Exception {

    String linie;

    // declarare stream de intrare de tip BufferdReader

    BufferedReader flux_intrare = new BufferedReader(new4

  • InputStreamReader(new FileInputStream("fisier.txt")));

    try {

    while ((linie = flux_intrare.readLine()) != null)

    System.out.println(linie);

    } catch (IOException e) {

    System.out.println("Eroare de citire date!");

    };

    flux_intrare.close();

    return;

    }

    }

    Task 2: Compilati si rulati urmatorul program. Care e diferenta fata de cel dinainte?

    import java.io.*;

    class Citire {

    public static void main(String[] args) throws Exception {

    String linie;

    int p=0;

    5

  • // declarare stream de intrare de tip BufferdReader

    BufferedReader flux_intrare = new BufferedReader(new

    InputStreamReader(new FileInputStream("fisier.txt")));

    try {

    while ((linie = flux_intrare.readLine()) != null)

    {

    p = Integer.parseInt(linie);

    System.out.println(p);

    }

    } catch (IOException e) {

    System.out.println("Eroare de citire date!");

    };

    flux_intrare.close();

    return;

    }

    }

    6

  • Ierarhia completa a claselor pentru citirea unui flux text este prezentata in figura urmatoare:

    In mod analog sunt tratate intrarile binare prin fluxuri de intrare binare, prelucrate de clase

    provenind din ierarhia:

    Operatii de iesire

    Operatiile de iesire se realizeaza analog celor de intrare, utilizand de asemenea conceptul de

    stream. La fel ca si in cazul dispozitivelor de intrare, si cele de iesire sunt tratate identic.

    Scrierea datelor dintr-un flux de iesire text (linii de text) se realizeaza prin clasa PrintStream

    sau PrintWriter.7

  • Exemplu pentru scrierea pe consola:

    System.out este derivat direct din PrintStream

    int k = 5;

    System.out.println("Mesaj 3");

    System.out.println(k);

    Pentru scrierea intr-un fisier text se poate folosi clasa PrintWriter:

    Task 3: Compilati si rulati urmatorul cod Java

    PrintWriter fis = new PrintWriter(new FileWriter("FisIesire.txt"));

    int i = 12;boolean b = false;fis.println(i); fis.println(Numar +i);fis.println(b);fis.close();

    Ierarhia claselor pentru scrierea intr-un flux text este prezentata in figura urmatoare:

    In continuare se prezinta ierarhia claselor pentru scrierea intr-un flux binar:

    8

  • 2. Lucru cu fisiere in Java Taskuri

    Task 4: Scrieti un program Java care sa sorteze un tablou care contine numere reale citite

    dintr-un fisier. Vectorul sortat va fi scris tot intr-un fisier.

    Task 5: Scrieti un program Java care citeste dintr-un fisier cuvinte (un cuvant pe o linie) si

    scrie intr-un fisier pe un singur rand, cu un spatiu intre cuvinte, ce a citit.

    Bonus: Scrieti un program care citeste linii de la tastatura si le scrie intr-un fisier text.

    Programul se va opri la intalnirea unei linii care contine doar caracterul '.' pe prima

    pozitie.

    Bibliografie: http://www.opendrum.upt.ro/

    9

    ROMNIA Universitatea Politehnica din Bucuresti Facultatea de Antreprenoriat, Ingineria si Managementul Afacerilor