Stream-uri de Input/Output

De la WikiLabs
Versiunea din 22 august 2012 10:07, autor: Rhobincu (discuție | contribuții) (Pagină nouă: Un calculator comunică cu exteriorul prin una sau mai multe interfeţe de comunicare, numite şi porturi de intrare-ieşire (Input/Output - I/O). Exemple: portul serial, portul paral...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)
Jump to navigationJump to search

Un calculator comunică cu exteriorul prin una sau mai multe interfeţe de comunicare, numite şi porturi de intrare-ieşire (Input/Output - I/O). Exemple: portul serial, portul paralel, portul video, portul audio. Utilizând aceste interfeţe de comunicare, calculatorul este capabil să transmită şi să primească informaţii către/dinspre lumea exterioară prin intermediul diferitelor dispozitive periferce (monitor, imprimantă, tastatură, mouse, modem, placa de reţea, etc.)

Fluxuri de intrare-ieşire

Având în vedere numărul mare de tipuri de periferice, apariţia în permanenţă a unor periferice noi, precum şi faptul că perifericele existente se află într-o continuă dezvoltare, comunicarea directă a programelor cu acestea ar fi deosebit de dificil de realizat dacă s-ar utiliza direct instrucţiunile procesorului (in/out). În plus, complexitatea comunicării cu dispozitivele periferice mai creşte şi datorită faptului că sunt necesare mai multe modalităţi de comunicare: secvenţial, aleator, binar, caracter, linie cu linie etc. Există drivere de dispozitive (device drivers) care sunt module software ce oferă o interfaţă mai simplă de comunicare cu perifericul fizic, totuşi acestea nu rezolvă complet problema compatibilităţii operaţiilor de intrare-ieşire. Ca urmare, sistemul de operare introduce la rândul lui un nivel de uniformizare a operaţiilor cu dispozitivele periferice, oferind anumite funcţii standard de comunicare cu acestea. Însă limbajele de programare (în acest caz, Java) sunt concepute să lucreze cu mai multe sisteme de operare, astfel încât sunt necesare funcţii standard (unitare) de comunicare cu dispozitivele periferice definite în cadrul limbajului de programare, independente de funcţiile oferite de sistemele de operare.

În vederea tratării unitare a comunicaţiei, Java foloseşte conceptul de flux (stream). Apariţia conceptului de flux se datorează lui Dennis Ritchie care a implementat primul sistem de intrare-ieşire bazat pe fluxuri în cadrul sistemului de operare Unix, în anul 1984. Ideea de flux are la bază crearea unui canal de comunicatie, general valabil, între două entităţi, fie ele software sau hardware, cu condiţia ca una dintre entități să fie sursă iar cealaltă destinatie. Astfel, sursa va trimite (va scrie) informație în canalul de comunicație (flux) iar destinația va prelua (va citi) informația din canal. Astfel conceptul de flux oferă posibilitatea tratarii unitare a oricarui tip de comunicaţie, cu orice tip de entitate din sistem. Definirea unui flux (a unui canal de comunicație) se face prin definirea capetelor lui, a sursei şi a destinației. Datorită faptului că există două direcții de comunicare se poate face o delimitare în două tipuri de fluxuri: flux de intrare (input stream) şi flux de ieşire (output stream). Fluxurile de intrare sunt fluxuri care se conectează cu dispozitivele care furnizează date (exemplu, tastatura) iar fluxurile de ieşire se conectează cu dispozitive care preiau date (exemplu: monitorul). Sursa sau destinaţia pot fi atat periferice cât şi module software.

Stream-uri pentru consolă

Limbajul Java pune la dispoziția utilizatorului trei fluxuri standard pentru comunicare cu consola:

  • fluxul standard de intrare (Standard Input) – folosit pentru citirea datelor.
  • fluxul standard de ieşire (Standard Output) – folosit pentru afişarea datelor.
  • fluxul standard de eroare (Standard Error) – folosit pentru afişarea erorilor.

În Java toate fluxurile standard sunt accesate prin clasa System. Astfel, pentru Standard Input există fluxul System.in, pentru Standard Output, System.out iar pentru Standard Error, System.err. Cei trei membrii in, out, err ai clasei System sunt membri statici, ceea ce face posibil accesul lor prin utilizarea directă a numelui clasei, fără a fi nevoie de instanţierea unui obiect.

Clasele care descriu operaţiile de intrare-ieşire se află în pachetul java.io. Acesta conţine două categorii de fluxuri: fluxuri la nivel de octet şi fluxuri la nivel de caracter. Fluxurile la nivel de octet au fost introduse începând cu versiunea JDK 1.0.2, iar fluxuruile la nivel de caracter au fost introduse începând cu versiunea JDK 1.1. Acestea din urmă nu înlocuiesc, ci completează funcţionarea fluxurilor cu posibilitatea de introducere şi extragere a caracterelor (care în Java au 2 octeţi).