il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · per...

37
1 - lezione 09 - I/O in Java Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2008-2009 Alessandro Longheu http://www.diit.unict.it/users/alongheu [email protected] 2 A. Longheu – Linguaggi M-Z – Ing. Inf. 2008-2009 Il package java.io Il package java.io definisce i concetti base per gestire l’I/O da qualsiasi sorgente e verso qualsiasi destinazione. L’obiettivo è fornire un’astrazione che incapsuli tutti i dettagli di una sorgente dati o di un dispositivo di output un modo semplice e flessibile per aggiungere ulteriori funzionalità a quelle fornite dal canale "base"

Upload: others

Post on 16-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

1

-lezio

ne 0

9 -

I/O in Java

Linguaggi

Corso

M-Z -Lau

rea in In

gegneria In

formatica

A.A. 2

008-2009

Alessa

ndro Lo

ngheu

http

://www.diit.u

nict.it/u

sers/alongheu

alessandro.lon

[email protected]

nict.it

2

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Il packa

ge ja

va.io

�Il p

acka

ge ja

va.io definisce

i concetti b

ase per g

estire

l’I/O

da qualsia

si sorgente e ve

rso qualsia

si destin

azio

ne.

�L’o

biettivo

èfornire

�un’astra

zione che incapsuli

tutti

i detta

gli

di

una

sorgente dati o

di un disp

ositivo

di output

�un modo semplice

e flessib

ile per aggiungere ulterio

ri funzio

nalità

a quelle fo

rnite dal ca

nale "b

ase"

Page 2: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

3

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Stre

am vs B

uffe

r

�Uno stre

am o flu

sso è

una se

quenza ordinata di dati:

�monodire

zionale (o

di in

put, o

di output)

�adatto

a tra

sferire

byte

(o anche ca

ratte

ri)

Program

Output S

tream

File

Input S

tream

�Buffe

r: deposito

di dati d

a (su

) cui si p

uò leggere (scrive

re)

�Canale:

connessio

ne con entità

in grado di eseguire

operazio

ni di I/O

; i canali in

cludono i b

uffe

r, i file e i so

cket

4

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�I

flussi

perm

etto

no

operazio

ni

di

I/O

blocca

nti. Il re

lativo

packa

ge in

Java è

il più

vecch

io java.io

�I

canali

perm

etto

no

operazio

ni

di

I/O

blocca

nti m

a anche operazio

ni n

on blocca

nti.

Il relativo

packa

ge è

java.nio, d

ove la

“n”sta

per n

ew m

a anche per n

on blocca

nte.

�Esiste

anche java.n

et, che co

nsente l’u

tilizzo

dei so

cket e

d è

basato su

flussi o

canali

Stre

am vs B

uffe

r

Page 3: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

5

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Classi stre

am

�Il p

acka

ge ja

va.io distin

gue fra

:�stre

am di byte

(analoghi ai file

binari d

el C

)�stre

am di ca

ratte

ri (analoghi ai file

di te

sto del C

, ma co

n

Unico

de a 16 bit)

�Questi

concetti

si tra

ducono in altre

ttante cla

ssi base

astra

tte:

�stre

am di byte

: InputStre

am e OutputStre

am

�stre

am di ca

ratte

ri: Reader e

Write

r�

Le cla

ssi InputStre

am/OutputStre

am so

no la

radice

di tu

tte

le cla

ssi di b

yte e le

classi R

eader/W

riter so

no la

radice

di

tutte

le cla

ssi basate su

i flussi d

i caratte

ri�

Per u

tilizzare una qualsia

si classe

di I/O

occo

rre effe

ttuare

l’import d

i java.io.* (o

di una sp

ecifica

classe

)

6

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Le cla

ssi e le interfa

cce di java.io si

posso

no divid

ere in 5

categorie

:�Classi g

enerali ch

e perm

etto

no di co

struire

tipi d

ifferenti d

i flussi d

i byte

o di ca

ratte

ri: flussi d

i input e

di output, d

i byte

e

caratte

ri, e le cla

ssi per co

nvertire

gli u

ni negli a

ltri�Un in

sieme di cla

ssi che definisco

no varia

nti d

i tipi d

i flussi:

filtrati, b

uffe

rizzati, p

iped

�Un insie

me di cla

ssi e interfa

cce rife

riti a flussi

di dati che

perm

etto

no di le

ggere e scrive

re valori p

rimitiv

i�Le cla

ssi e le

interfa

cce ch

e co

nsentono di in

teragire

con i

file indipendentemente dal SO

�Le cla

ssi e le

interfa

cce ch

e co

nsentono la

seria

lizzazione

degli o

ggetti: cio

èche perm

etto

no di tra

sform

are gli o

ggetti in

flussi d

i dati o

viceversa

Classi stre

am

Page 4: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

7

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�L’a

pproccio

degli stre

am è

denominato “a

cipolla”:

�alcu

ni tip

i di stre

am ra

ppresentano so

rgenti d

i dati o

disp

ositivi

di uscita

�file

, connessio

ni di re

te,

�arra

y di byte

, ...

�gli a

ltri tipi d

i stream so

no pensati p

er "a

vvolgere" i p

recedenti

per a

ggiungere u

lterio

ri funzio

nalità

.�

Cosìèpossib

ile co

nfigurare il ca

nale di co

munica

zione co

n tu

tte e

sole le funzio

nalità

che servo

no senza doverle

replica

re e

reimplementare piùvolte.

Stre

am incapsulante

Stre

am

sorgente

Stre

am

destin

azio

ne

Classi stre

am

8

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Le quattro

classi b

ase astra

tte di ja

va.io

stream di byte

Object

InputStre

am

Outputstre

am

Reader

Write

r

stream di ca

ratte

ri

Classi stre

am

Page 5: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

9

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Inp

utS

tream

Ou

tpu

tStrea

m

Ra

nd

om

AccessF

ile

Ob

ject

Pip

edO

utp

utS

tream

Seq

uen

ceInp

utS

tream

Strin

gB

ufferIn

pu

tStream

ByteA

rrayO

utp

utS

tream

Ob

jectOu

tpu

tStr

eam

FilterO

utp

utS

tream

FileO

utp

utS

trea

m

Pip

edIn

pu

tStream

Pu

shB

ackIn

pu

tStream

Bu

fferedIn

pu

tStream

Lin

eNu

mb

erInp

utS

tream

Da

taIn

pu

tStrea

m

Bu

fferedO

utp

utS

tream

Da

taO

utp

utS

tream

Prin

tStrea

m

Ob

jectInp

utS

trea

m

FilterIn

pu

tStream

FileIn

pu

tStrea

m

ByteA

rrayIn

pu

tStream

D

ata

Inp

ut

Da

taO

utp

ut

Ob

jectOu

tpu

t

Ob

jectInp

ut

Classi stre

am di byte

10

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Classi stre

am di byte

Page 6: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

11

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Re

ad

er

Write

r

Str

ea

mT

ok

en

ize

r

Ob

jec

t

Pr

intW

rite

r

Bu

ffere

dW

riter

Ch

arA

rray

Write

r

Pip

ed

Write

r

Filte

rWrite

r

Pip

ed

Re

ad

er

Lin

eN

um

be

rRe

ad

er

File

Re

ad

er

Pu

shB

ac

kR

ea

de

r

File

Wr

iter

Strin

gW

riter

Strin

gR

ea

de

r

Inp

utS

trea

mR

ea

de

r

Ch

arA

rray

Re

ad

er

Bu

ffer

ed

Re

ad

er

Filte

rRe

ad

er

Ou

tpu

tStre

am

Write

r

Classi stre

am di ca

ratte

ri

12

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Classi stre

am di ca

ratte

ri

Page 7: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

13

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�La cla

sse astra

tta In

putStre

am definisce

il concetto

generale di “flu

sso di in

put”operante su

i byte

�Dich

iara i m

etodi ch

e perm

etto

no di le

ggere i b

yte

a partire

da una sp

ecifica

sorgente

�InputStre

am è

una cla

sse astra

tta, q

uindi i m

etodi

dovra

nno esse

re realmente definiti

dalle cla

ssi deriva

te,

in modo specifico

a seconda della

sorgente dati.

�Il m

etodo co

strutto

re apre lo stre

am

Classe

Inputstre

am (b

yte)

14

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public ab

stract int read

() throws IO

Excep

tion�

Legge un sin

golo byte

di d

ati e

lo re

stituisce

sotto

form

a di in

tero

compreso tra

0 e 255. S

e non è

disp

onibile alcu

n byte

restitu

isce

il valore -1

. Viene utilizza

to un in

t e non un byte

perch

èi va

lori

sono 257 (co

mpreso il -1);

chiaramente, solo I 16 bit

meno

significa

tivi sono quelli u

tilizzati p

er re

stituire

il valore 0-255

public in

t read(byte[] b

, int offset, in

t count) th

rows IO

Excep

tion�

Legge una se

quenza di b

yte e lo

memorizza

in una parte

di u

n

arra

y di byte

a partire

dall’e

lemento di posizio

ne offset

e in

numero m

assim

o di cou

nt

public in

t read(byte[] b

) throws IO

Excep

tion�

Come il m

etodo precedente co

n offse

t=0 e co

unt=buff.le

ngth

�I metodi read con parametri

sono un overlo

ad del prim

o, e

utilizza

no il co

dice

del p

rimo per o

perare, q

uindi è

sufficie

nte ch

e

sia im

plementato ta

le prim

o m

etodo dalle so

ttocla

ssi per a

vere

anche disp

onibili g

li altri

Classe

Inputstre

am (b

yte)

Page 8: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

15

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public lon

g skip

(long cou

nt) th

rows IO

Excep

tion

�Avanza il flu

sso sa

ltanto di u

n numero di b

yte pari a

count. S

i arre

sta se raggiunge la fine del flusso

. Restitu

isce il numero

effe

ttivo di byte

. Se co

unt è

negativo

non avanza affa

ttopublic in

t available() th

rows IO

Excep

tion�

Restitu

isce il numero di byte

che posso

no esse

re letti

senza

arre

starsi

public void

close() throw

s IOExcep

tion

�Chiude il flu

sso. La

chiusura di u

n flu

sso già

chiuso non ha alcu

n

effe

tto. A

l suo in

terno dovre

bbe anche rila

sciare tu

tte le

risorse

asso

ciate al flu

sso (a

d esempio descritto

ri di file

). La lib

erazio

ne

di ta

li risorse

non è

automatica

; potre

bbe esse

re fa

tta all’in

terno

di un eventuale metodo finalize

(), ma la garbage collectio

n è

asin

crona, p

er cu

i èopportu

no in

serire

tutto

il codice

di rila

scio

risorse

dentro

tale m

etodo. L’im

plementazio

ne di d

efault d

i tale

metodo non fa

nulla.

Classe

Inputstre

am (b

yte)

16

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�La cla

sse astra

tta OutputStre

am definisce

il

concetto

generale di “flu

sso di output”operante su

i byte

�Dich

iara i metodi che perm

etto

no di scrive

re dei

byte

a partire

da una sp

ecifica

sorgente

�OutputStre

am è

una cla

sse astra

tta,

quindi i

metodi dovra

nno esse

re realmente definiti

dalle

classi d

eriva

te, in

modo sp

ecifico

a se

conda della

sorgente dati.

�Il m

etodo co

strutto

re apre lo stre

am

Classe

Outputstre

am (b

yte)

Page 9: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

17

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public ab

stract void write(in

t b) th

rows IO

Excep

tion

�Scrive

b sotto

form

a di byte

. Del valore int b

vengono presi

in consid

erazio

ne solo gli otto

bit

meno sig

nifica

tivi; vie

ne consid

erato int perch

èsolita

mente

l’argomento

èil

risultato

di

un’operazio

ne aritm

etica

public

void write(b

yte[] b, int offset,

int

count)

throws IO

Excep

tion

�Scrive

una parte

dell’a

rray d

i byte

buf a

partire

da

buf[o

ffset],

scrivendo un numero di byte

pari

a

count

int w

rite(byte[] b

) throws IO

Excep

tion

�Come so

pra m

a co

n offse

t=0 e co

unt=buff.le

ngth

Classe

Outputstre

am (b

yte)

18

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public vo

id flu

sh() th

rows IO

Excep

tion

�Effe

ttua lo svu

otamento del flusso

; se il

flusso

aveva deposita

to in un buffe

r i dati,

li scrive

immediatamente per svu

otare il flu

sso; se

l’uscita

del flusso

èun altro

flusso

, anche questo

vie

ne

svuotato, il tu

tto se

guendo la ca

tena dei flu

ssi. Se il

flusso

non èfornito

di buffe

r, il metodo non ha

effe

tto (co

sa ch

e co

incid

e co

n l’im

plementazio

ne di

default)

void clo

se() throws IO

Excep

tion

�Chiude il

flusso

. Dovre

bbe rila

sciare le riso

rse

(l’implementazio

ne di default n

on fa

nulla).

Classe

Outputstre

am (b

yte)

Page 10: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

19

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Le cla

ssi per l’I/O

da stre

am di caratte

ri (Reader e

Write

r) sono più

efficie

nti d

i quelle

a byte

�hanno nomi analoghi e stru

ttura analoga

�Converto

no

corre

ttamente

la

codifica

UNICODE di Ja

va in quella locale

�specifica

della

piatta

form

a

in

uso

(Windows, D

OS, A

SCII)…

�...e

della lingua in uso (esse

nzia

le per

l’internazio

nalizza

zione).

Classi p

er stre

am di ca

ratte

ri

20

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�La cla

sse Reader è

simile alla cla

sse In

putStre

am. I m

etodi in

Reader so

no so

ggetti a

lla interpretazio

ne dei ca

ratte

ri.

public in

t read(ch

ar b[]) th

rows IO

Excep

tion

�Legge un ca

ratte

re e lo

restitu

isce co

me un in

tero co

mpreso

tra 0 e 65535. O

ltre la fin

e del flu

sso re

stituisce

-1public ab

stract int read

(char [] b

uf, in

t offset, int cou

nt) th

rows

IOExcep

tion�

Legge una se

quenza di ca

ratte

ri e lo m

emorizza

in una parte

di u

n arra

y di ch

ar a

partire

dall’e

lemento di p

osizio

ne offse

t e in numero m

assim

o di co

unt

public ab

stract int read

(char b

uf[]) th

rows IO

Excep

tion

�Come so

pra m

a co

n offse

t=0 e co

unt=buff.le

ngth

Classe

Reader (ca

ratte

ri)

Page 11: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

21

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public

abstract

int

read(java.n

io.CharB

uffer

buf[])

throws

IOExcep

tion�

Tenta di le

ggere quanti p

iùcaratte

ri possib

ili senza ca

usare un

overflo

w. R

estitu

isce il n

umero di ca

ratte

ri effe

ttivamente letti

public lo

ng skip

(long co

unt) th

rows IO

Excep

tion

�Avanza il flu

sso di co

unt ca

ratte

ri. Si a

rresta

se ra

ggiunge la

fin

e del flu

sso. R

estitu

isce il n

umero effe

ttivo di byte

. public b

oolean

ready() th

rows IO

Excep

tion

�Restitu

isce tru

e se

il flusso

èpronto per e

ssere letto

public vo

id clo

se() throw

s IOExcep

tion

�Chiude il flu

sso. D

ovre

bbe rila

sciare tu

tte le riso

rse.

Classe

Reader (ca

ratte

ri)

22

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esisto

no diffe

renze fra

Reader e

InputStre

am:

�In Reader,

il metodo fondamentale per la lettu

ra

utilizza

un arra

y di ca

ratte

ri, e gli a

ltri metodi so

no

definiti

in term

ini di questo

; per Inputstre

am, il

metodo di base usa il sin

golo byte

�In Reader, il m

etodo clo

se va

solita

mente rid

efinito

perch

èl’im

plementazio

ne di

base vuota non è

sufficie

nte

�InputStre

am perm

ette

di

sapere quanti

byte

è

possib

ile leggere, mentre

Reader consente solo di

sapere se

esisto

no ancora dati

Classe

Reader (ca

ratte

ri)

Page 12: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

23

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�La cla

sse W

riter è

simile alla cla

sse OutputStre

am.

public vo

id write (ch

ar b) th

rows IO

Excep

tion

�Scrive

b so

tto fo

rma di ca

ratte

re (1

6 bit m

eno sig

nifica

tivi)public ab

stract int w

rite(char []b

uf, in

t offset, int co

unt) th

rows IO

Excep

tion

�Scrive

un arra

y di ca

ratte

ri da buf[o

ffset] p

er co

unt ca

ratte

ripublic ab

stract int w

rite(char b

uf[]) th

rows IO

Excep

tion

�Come so

pra m

a co

n offse

t=0 e co

unt=buff.le

ngth

public ab

stract void flu

sh() th

rows IO

Excep

tion

�Effe

tua lo svu

otamento del flu

ssopublic vo

id clo

se() throws IO

Excep

tion

�Chiude il flu

sso.

�Valgono per la

Write

r le ste

sse co

nsid

erazio

ni fa

tte per la

Reader, tra

cui

il fatto

che la ve

rsione fo

ndamentale di w

rite è

quella re

lativa

all’a

rray d

i char, le

altre

utilizza

no questa

, che è

quindi quella da im

plementare

Classe

Write

r (caratte

ri)

24

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Conversio

ne flu

ssi

�I

flussi

di

conversio

ne

InputStre

amReader

e

OutputStre

amWrite

r, este

nsio

ni risp

ettiva

mente di R

eader e

Write

r (flussi d

i caratte

ri) perm

etto

no di co

nvertire

tra lo

ro

flussi d

i caratte

ri e byte

utilizza

ndo una co

difica

specifica

o

la co

difica

di default d

efin

ita per il siste

ma locale

�Costru

ttori fo

ndamentali:

public In

putStream

Read

er(InputStream

in)

public O

utputStream

Writer (O

utputStream

in)

�I

metodi read di InputStre

amReader

leggono i byte

dall’In

putStre

am asse

gnato, e

li converto

no in

caratte

ri con

la codifica

appropria

ta; analogamente, i metodi write

di

OutputStre

amReader co

nverte

i caratte

ri a disp

osizio

ne in

byte

e li m

anda all’O

utputStre

am asse

gnato

�In entra

mbe le

classi, la

chiusura del flu

sso di co

nversio

ne

comporta

la ch

iusura del flu

sso di byte

asso

ciato

Page 13: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

25

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Conversio

ne flu

ssi

�Syste

m.in, Syste

m.out e Syste

m.err

sono i tre

flussi

standard

asso

ciati

all’in

put,

output

e

standard erro

r�Storica

mente, sono sta

ti progetta

ti insie

me alle

prim

e versio

ni di Java, quando esiste

vano solo

flussi

di byte

, e tali sono anche se dovre

bbero

esse

re flu

ssi di ca

ratte

ri, il che può risu

ltare ta

lora

scomodo o apparentemente incoerente

26

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Classi d

ei flu

ssi -Varia

nti

�Flussi

Filte

rsono

classi

astra

tte

che

rappresentano tu

tti quei flu

ssi ai q

uali è

applica

ta

una operazio

ne di

filtraggio;

posso

no esse

re

concatenati p

er p

rodurre

filtraggi so

fisticati

�Flussi

Buffe

red

aggiungono ai flu

ssi usuali

la

presenza di u

n buffe

r in m

odo ch

e re

ad e w

rite

non rich

iedano di a

ccedere al file

system ad ogni

invocazio

ne

�Flussi

Piped

vengono progetta

ti come co

ppie in

modo ch

e all’in

terno della co

ppia posso

no esse

re

canalizza

te (p

iped) le

inform

azio

ni

Page 14: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

27

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�I F

lussi d

i memoria

perm

etto

no di u

tilizzare le

inform

azio

ni in

memoria

come so

rgenti o

destin

azio

ni di un flu

sso:

�Byte

Arra

y�CharArra

y�Strin

g�Flussi solo input o

output (se

nza co

ntro

parte

)�Prin

t (fornisco

no i m

etodi prin

t e prin

tln)

�Lin

eNumberReader (le

ttore co

n buffe

r per co

ntare i n

umeri d

i rig

a)

�SequenceInputStre

am (co

nverte

una sequenza di oggetti

InputStre

am in uno so

lo)

�Flussi per la

costru

zione di parser

�Flussi

Pushback

(per

tornare indietro

in fase di lettu

ra

(lookahead, u

tile per lo

scanning))

�Stre

amTokenize

r (suddivid

e un Reader in

un flu

sso di to

ken,

utile

per il p

arsin

g)

Classi d

ei flu

ssi -Varia

nti

28

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�La presenza di dive

rse cla

ssi che operano sui flussi

richiede un

mecca

nism

o (possib

ilmente uniform

e) di tra

ttamento dei problemi di

sincro

nizza

zione e co

ncorre

nza

�Le classi che operano sui flu

ssi di byte

si sin

cronizza

no su

tale

flusso

, garantendo co

munque l’a

tomicità

delle operazio

ni, a

d esempio in

caso di scrittu

ra sim

ultanea da parte

di d

ue th

read, il flu

sso risu

ltante

evita

l’infra

mezza

rsi dei b

yte scritti d

ai d

ue th

read, g

arantendo ch

e si

trovi

prim

a l’in

tera sequenza di un thread e dopo l’in

tera sequenza

dell’a

ltro.

Nell’o

perazio

ne di

lettu

ra di

N byte

, i

due thread

acce

derebbero a due porzio

ni di N byte

poste

consecutiva

mente nel

flusso

Le classi che operano sui flu

ssi d

i caratte

risi sin

cronizza

no su

un

capo protetto

di n

ome lo

ck che per d

efault è

un rife

rimento al flu

sso

stesso

, e ch

e potre

bbe anche esse

re un altro

flusso

(passa

bile co

me

parametro

dei metodi costru

ttori

di Reader e Write

r), ad esempio

la

classe

Strin

gWrite

r, sotto

classe

di W

riter, scrive

i caratte

ri utilizza

ndo un

oggetto

Strin

gBuffe

r, a cui lock

viene rife

rito; in generale, lo

ck deve

quindi esse

re rife

rito all’o

ggetto

effe

ttivamente usato co

me flu

sso

Classi d

ei flu

ssiSincro

nizza

zione e co

ncorre

nza

Page 15: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

29

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Nel ca

so si u

tilizzino flu

ssi in

capsulati, in

acco

rdo co

n l’a

pproccio

“a

cipolla”,

la sin

cronizza

zione dipende dal flusso

più

interno; questo

potre

bbe co

mporta

re problemi n

el ca

so le

classi in

capsulanti rich

iedano

operazio

ni a

tomich

e al lo

ro live

llo, o

perazio

ni ch

e potre

bbe nonesse

re

garantito

che lo

siano perch

éad esempio potre

bbero co

rrispondere a

più

operazio

ni del flu

sso in

terno, cia

scuna atomica

ma non atomich

enel

loro insie

me

�Le operazio

ni di input in genere sono bloccanti

(si resta

in atte

sa

finchèi d

ati n

on dive

ntano disp

onibili), e

spesso

lo so

no anche quelle di

output (la

scrittura su

un so

cket p

otre

bbe dovere atte

ndere).

�Se queste

operazio

ni, co

me so

litamente si fa

, sono im

plementate da un

thread, si p

otre

bbe im

plementare anche la

parte

di co

dice

relativa

ad

una rich

iesta

di in

terru

zione in

vocata su

l thread ste

sso, a

d esempio per

liberare la

risorsa

o per d

are in

form

azio

ni su

llo sta

to di a

vanzamento

prim

a della rich

iesta

di interru

zione. Le situ

azio

ni che si

dovre

bbero

fronteggiare so

no tu

ttavia

spesso

complica

te, p

erta

nto si p

referisce in

genere m

antenere completamente bloccanti (n

on in

terro

mpibili)

le operazio

ni d

i I/O; ja

va.nio offre

strumenti a

ggiuntivi ch

e perm

etto

no

di affro

ntare il p

roblema.

Classi d

ei flu

ssiSincro

nizza

zione e co

ncorre

nza

30

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi filte

r

�Filte

rInputStre

am Filte

rOutputStre

am so

no i filtri p

er i flu

ssi di byte

�Filte

rReader F

ilterW

riter so

no i filtri p

er i flu

ssi di ca

ratte

ri�

Ogni flu

sso di tip

o filte

r ècollegato co

n un altro

flusso

a cu

i delega le

operazio

ni d

i I/O; p

er co

llegare ta

le flu

sso so

no

messi

a disp

osizio

ne co

strutto

ri che acce

ttano in in

gresso

un flu

sso, p

roprio

quello al quale sa

ranno poi co

nnessi

�E’possib

ile co

nnette

re un qualunque numero di flu

ssi Filte

r di tip

o byte

o ca

ratte

re, e

la so

rgente orig

inale non deve

necessa

riamente esse

re un flu

sso Filte

r; questo

vale anche

per i flu

ssi di output

�Non tu

tte le

classi d

i tipo Filte

r modifica

no re

almente i d

ati,

ad esempio una cla

sse che intro

duce una buffe

rizzazio

ne

applica

un filtro

al flusso

, ma solo di natura semantica

(co

mporta

mentale)

Page 16: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

31

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io

.*;

public class C

onvertito

re extends FilterR

eader

{ public C

onvertito

re (Read

er in) {su

per (in

);}public in

t read() th

rows IO

Excep

tion

{int c =

super.read

();retu

rn (c =

= -1

? c : Character.toU

pperC

ase((char)c));

}public in

t read(ch

ar buf[], in

t offset, in

t count)th

rows IO

Excep

tion

{int n

read = su

per.read

(buf,o

ffset,count);

int last =

offset +

nread

;for (in

t i = offset; i<

last; i++)

buf[i]=

Character.toU

pperC

ase(buf[i]);

return nread

;} Flussi filte

r –Esempio

32

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

public static vo

id m

ain (S

tring[] arg

s)throws IO

Excep

tion

{Strin

gRead

er src = new

Strin

gRead

er(args[0

]);FilterR

eader f =

new

Convertito

re(src);int c=

f.read();

while (c !=

-1)

{System

.out.p

rint((ch

ar)c); c=

f.read();

}}

}

Flussi filte

r –Esempio

Page 17: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

33

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi b

uffe

red

�Java in

troduce stre

am ch

e utilizza

no un buffe

r per rid

urre

il numero di a

ccessi a

l flusso

più

interno, ve

locizza

ndo quindi

le operazio

ni di input e output (ad esempio nel caso di

acce

sso ai file

).�

Il flusso

più

interno è

fornito anche in questo

come

parametro

al costru

ttore; esiste

anche un costru

ttore che

perm

ette

di sp

ecifica

re anche la dimensio

ne del buffe

r�

Quando si

invoca il m

etodo read su un flu

sso buffe

rizzato

vuoto,

questo

invoca il

corrisp

ondente read sul flusso

interno, rie

mpie il b

uffe

r e da quel m

omento le

succe

ssive

chiamate alla re

ad attin

gono dal b

uffe

r per re

stituire

i dati;

solo quando il b

uffe

r si svuota si re

invoca la re

ad so

ttosta

nte

�La scrittu

ra fu

nzio

na in

maniera analoga: la

write

del flu

sso

buffe

rizzato rie

mpie il b

uffe

r e so

lo quando è

pieno produce

un’invocazio

ne su

l write

“reale”(del flu

sso interno)

34

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi b

uffe

red

�Il

flusso

più

interno fornito

come parametro

al

costru

ttore non può esse

re restitu

ito dall’o

ggetto

contenito

re,

perta

nto se occo

rre utilizza

rlo è

necessa

rio conservarne un rife

rimento

�Quando tu

ttavia

si mantiene un rife

rimento ad un

flusso

interno ad un altro

(ad esempio buffe

rizzato),

prim

a di utilizza

re il

flusso

interno è

opportu

no

invocare un flu

shsul flu

sso este

rno, in

modo ch

e

eventuali

operazio

ni non ancora propagate dal

flusso

contenito

re a quello interno possa

no avere

luogo (ad esempio lo svu

otamento del buffe

r) rendendo co

sìconsiste

nte l’a

ccesso

al flu

sso interno

Page 18: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

35

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi p

iped

�I flussi

Piped vengono utilizza

ti come coppie di flussi

di

input/o

utput a

ccoppiati. La

pipe m

antiene al su

o in

terno un

buffe

r della ca

pacità

defin

ita in

fase di im

plementazio

ne ch

e

perm

ette

alle ve

locità

di le

ttura e scrittu

ra di esse

re diffe

renti

�I flu

ssi Piped fo

rnisco

no un m

ecca

nism

o per co

munica

re tra

due th

read diffe

renti, a

ssocia

ti alle due co

ntro

parti; l’u

so dei

thread è

in re

altà

l’unico

modo sicu

ro di utilizza

re le pipe

�Ogni pipe tiene tra

ccia dei thread letto

ri e scritto

ri più

recenti, e

in una co

ppia di th

read la

pipe ve

rifica l’e

sistenza

della co

ntro

parte

prim

a di a

rresta

re il th

read co

rrente; se

la

contro

parte

ha term

inato l’esecuzio

ne, vie

ne sollevata una

IOExce

ption

�Input: P

ipeInputStre

am e PipeReader

�Output: P

ipeOutputStre

am e PipeWrite

r

36

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi d

i memoria

�Mediante i flussi

ByteArra

yèpossib

ile utilizza

re un arra

y di

byte

come so

rgente o destin

azio

ne di un flu

sso di byte

�La Byte

Arra

yInputStre

am consente di effe

ttuare l’in

put da un

arra

y di byte

; la lettu

ra non può arre

starsi

(la sorgente èin

memoria

) e vie

ne effe

ttuata prelevando i dati

dall’a

rray (non

viene effe

ttuata una qualch

e copia interna),

perta

nto occo

rre

preserva

re i d

ati p

er tu

tta la durata della lettu

ra

�Per l’o

utput si u

tilizza la Byte

Arra

yOutputStre

am, ch

e perm

ette

di

memorizza

re dati in

un arra

y di byte

di dimensio

ne cre

scente

�I flu

ssi CharArra

ysono sim

ili ai B

yteArra

y ma operano su

char,

anche questi se

nza interru

zioni

�Strin

gReader

legge

senza

interru

zioni

da una strin

ga

(specifica

ta co

me parametro

nel co

strutto

re)

�Strin

gWrite

rperm

ette

di scrive

re dati

entro

un buffe

r, e di

recuperarne il co

ntenuto co

me oggetto

Strin

g o Strin

gBuffe

r

Page 19: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

37

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�I flu

ssi Prin

tperm

etto

no di semplifica

re la scrittu

ra in form

a

leggibile agli u

mani dei va

lori d

i tipi prim

itivi e oggetti .

�La Prin

tStre

am opera su byte

, la Prin

tWrite

r su char;

la cla

sse

rilevante è

la Prin

tWrite

r, ma per motivi

storici

Syste

m.out e

Syste

m.err so

no Prin

tStre

am; è

opportu

no quindi u

tilizzare so

lo la

Prin

tWrite

r�

Fornisco

no entra

mbe i m

etodi p

rint e

prin

tln per O

bject, ch

ar, in

t, float, b

oolean, ch

ar[], lo

ng, d

ouble e Strin

g; ta

li metodi so

no da

utilizza

rsi in sostitu

zione dei metodi write

dei flussi

quando si

voglia otte

nere un fo

rmato le

ggibile dagli u

mani, a

d esempio data

una varia

bile float

f, l’istru

zione out.p

rint(f)

invocata sul

Prin

tStre

am out,

se dovesse

esse

re realizza

ta tra

mite write

dive

nterebbe out.w

rite(Strin

g.va

lueOf(f).g

etByte

s())�

I flussi d

i stampa non so

llevano IO

Exce

ptio

n durante la

scrittura;

per

contro

llare eventuali

erro

ri, occo

rre invocare il

metodo

checkE

rror, ch

e effe

ttua il flu

sh del flu

sso e ne co

ntro

lla lo sta

to

Flussi m

onodire

zionali

Prin

t

38

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi m

onodire

zionali

LineNumberReader e

SequenceInputStre

am

�Il flu

sso LineNumberReadertiene tra

ccia dei numeri

di

riga durante la lettu

ra del te

sto. Il te

sto so

litamente provie

ne

da un flusso

passa

to come parametro

al costru

ttore di un

oggetto

Lin

eNumberReader,

sempre secondo l’approccio

“a

cipolla”

�Una rig

a si ritie

ne co

nclu

sa quando si in

contra

il linefeed (\n

) il

carria

ge return (\r)

o ambedue di seguito (\r\n

); in

corrisp

ondenza di tali

caratte

ri, si

conteggiano le linee,

potendo

poi

conosce

rne

il numero

con

il metodo

getLin

eNumber;

esiste

anche il setLin

eNumber per potere

contro

llare il co

nteggio

�La classe SequenceInputStre

am

crea un unico

flusso

di

input leggendo e concatenando uno o piu flu

ssi di byte

InputStre

am

�La gestio

ne dei flussi

da concatenare avvie

ne tra

mite un

oggetto

di tip

o Enumeration

Page 20: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

39

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi p

er P

arse

rPushback

�I flussi

Pushback

perm

etto

no di “rip

orta

re indietro

”la

lettu

ra di caratte

ri o byte

quando ci

si è

spinti

troppo

avanti (lo

okahead)

�il flu

sso è

buffe

rizzato (la

dimensio

ne vie

ne sp

ecifica

ta co

n

il costru

ttore),

quindi si

posso

no rip

orta

re indietro

un

numero di b

yte o ca

ratte

ri pari a

llo sp

azio

libero co

rrente

del buffe

r (ecomunque non superio

re alla dimensio

ne

max);

se la rich

iesta

è

di più

byte

o caratte

ri vie

ne

sollevata un’IO

Exce

ptio

n�

I dati

sono reinseriti

nel buffe

r, e questo

potre

bbe

alterarne l’o

rdine, a

d esempio se

sono le

tti i caratte

ri ‘1’,

‘2’, ‘3

’, e poi si in

voca per tre

volte il m

etodo unread(‘1

’), unread(‘2

’), unread(‘3

’), le su

ccessive

lettu

re produrra

nno

‘3’, ‘2

’, ‘1’, in

acco

rdo all’o

rdine di in

serim

ento nel buffe

r

40

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esempio ch

e sta

mpa la lunghezza

della piùlunga se

quenza di byte

uguali:

import java.io

.*;

class Cont {

public static vo

id m

ain (S

tring s[]) th

rows IO

Excep

tion

{PushbackIn

putStream

in = new

PushbackIn

putStream

(System

.in);

int m

ax = 0;

int m

axB = -1;

int b

;do {

int co

unt;

int b

1 = in.read

();for (co

unt =

1; (b

= in.read

()) == b1; co

unt +

+) con

tinue;

if (count >

max)

{max =

count;

maxB

= b1;

}in.unread

(b);

} while (b

!= -1

);System

.out.p

rintln

(max +

“byte d

i”+ m

axB);}}

Flussi p

er P

arse

rPushback

Page 21: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

41

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi p

er P

arse

r Stre

amTokenize

r

�La cla

sse Stre

amTokenize

r consente di le

ggere uno stre

am di in

gresso

(in

capsulato e fornito

come parametro

nel costru

ttore) e identifica

i

token presenti n

ella strin

ga; U

na cla

sse piùgenerale è

java.util.sca

nner

�La cla

sse prevede un insie

me di metodi per imposta

re i crite

ri di

scansio

ne e tokenizza

zione; una volta sce

lti, il

metodo nextT

oken

applica

to al flu

sso co

nsente di otte

nere il to

ken co

rrente

�I m

etodi per i crite

ri perm

etto

no di sp

ecifica

re quali ca

ratte

ri:�

sono da consid

erarsi

come parte

delle parole; di default sono gli

interva

lli ‘a’, …

, ‘z’, ‘A’, …

, ‘Z’, e

i valori n

on ASCII 7

bit d

al ca

ratte

re

128+32 a 255 (IS

O8859)

�rappresentano sp

azi b

ianchi (se

paratori d

i token); d

i default so

no dal

codice

ascii 0

al 32 (‘

‘)�

sono ordinari, o

ssia da ignorare (ve

ngono letti co

sìcome so

no)

�rappresentano l’id

entifica

tore di un co

mmento; d

i default è

‘/’�

rappresentano i d

elim

itatori d

elle co

stanti strin

g; d

efault ‘

“‘

�i m

etodi h

anno effe

tto cu

mulativo

(si posso

no aggiungere in

terva

lli e/o

singoli caratte

ri); resetSyntax()

consente di resetta

re i crite

ri sin

ora

imposta

ti

42

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Esisto

no quattro

tip

i di to

ken, cia

scuno id

entifica

to da una co

stante

della cla

sse:

TT_WORD, se

il token è

una parola.

TT_NUMBER, se

il token è

un numero.

TT_EOL, se

lettu

ra fin

e lin

ea.

TT_EOF, se

si incontra

la fin

e del file

.�

Esisto

no anche i ca

mpi della cla

sse:

int ttyp

e, ch

e co

ntiene il tip

o del to

ken co

rrente

double nval, ch

e co

ntiene il va

lore del to

ken co

rrente se

èun numero.

Strin

g sva

l, che co

ntiene il va

lore del to

ken co

rrente se

èuna strin

ga.

�Il m

etodo prin

cipale infine è

nextT

oken:

public in

t nextT

oken

() throw

s IOExcep

tion

�Il

token sucessivo

vie

ne tro

vato nella strin

ga di input

del

Stre

amTokenize

r.�

Il tip

o del token succe

ssivo vie

ne rito

rnato nel campo ttyp

eSe ttyp

e == TT_WORD, il to

ken è

memorizza

to in sva

l; �

se ttyp

e == TT_NUMBER, il to

ken è

memorizza

to in nval.

Flussi p

er P

arse

r Stre

amTokenize

r

Page 22: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

43

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esempio ch

e re

stituisce

la so

mma dei va

lori n

umerici tro

vati n

elflusso

:import java.io.*

;class P

rova2

{public static void

main

(Strin

g s[]) th

rows IO

Excep

tion{

double x =

sumStream

(new

FileRead

er(“pippo.txt”);

System

.out.p

rintln

(x);}public static d

ouble su

mStream

(Read

er source) th

rows IO

Excep

tion{

Stream

Token

izer in = new

Stream

Token

izer(source);

double resu

lt = 0.0;

while (in

.nextT

oken

() != Stream

Token

izer.TT_EOF) {

if (in.ttyp

e == Stream

Token

izer.TT_NUMBER)

result =

result +

in.nval;

}return resu

lt;}}

Flussi p

er P

arse

r Stre

amTokenize

r

44

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi D

ataInput e

DataOutput

�Gli stre

am di dati

(DataInputStre

am e DataOutputStre

am) leggono e

scrivono tip

i prim

itivi in m

odo “m

achine-in

dependent”

�Ciò co

nsente di scrive

re un file

in un co

mputer e

leggerlo

in unaltro

con

caratte

ristiche dive

rse (siste

ma operativo

, struttu

ra del file

dive

rsa).

�Rappresentano

una

implementazio

ne dell’in

terfa

ccia DataInput

e

DataOutput risp

ettiva

mente; la cla

sse RandomAcce

ssFile implementa

entra

mbe le interfa

cce�

Esisto

no m

etodi sp

ecifici p

er la

lettu

ra e scrittu

ra dei tip

i prim

itivi:int read

Byte() th

rows IO

Excep

tion

int read

Short() th

rows IO

Excep

tion

int read

Int() th

rows IO

Excep

tion

int read

Long() th

rows IO

Excep

tion

float read

Float() throws IO

Excep

tion

double read

Double() th

rows IO

Excep

tion

char read

Char() th

rows IO

Excep

tion

boolean

readBoolean

() throws IO

Excep

tion

Strin

g read

UTF() th

rows IO

Excep

tion

Esisto

no tu

tti i corrisp

ondenti w

rite

Page 23: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

45

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi p

er i file

�FileInputStre

am, F

ileOutputStre

am FileReader e

FileWrite

r perm

etto

no

di tra

ttare un file

come un flu

sso; p

resentano tre

costru

ttori

�Uno co

n argomento una Strin

g, il n

ome di un file

�Un oggetto

File

�Un FileDescrip

tor

�I flu

ssi di byte

non operano con i canali,

tutta

via sono in grado di

fornire

un oggetto

FileChannel del packa

ge ja

va.nio.Channel

�Oltre

gli o

ggetti F

ile, ch

e ra

ppresentano so

stanzia

lmente flu

ssicollegati

a file

(il ruolo del file

èsecondario

), esisto

no:

�la cla

sse FileDescrip

tor, u

sata per a

vere un nuovo flu

sso a partire

dallo ste

sso file

; occo

rre tutta

via presta

re atte

nzio

ne a più

flussi

che insisto

no su

llo ste

sso file

�La cla

sse File

, distin

ta dai flussi,

che fornisce

operazio

ni per la

manipolazio

ne del n

ome del file

: path, e

sistenza del file

, perm

essi,

creazio

ne, ca

ncellazio

ne (a

nche di dire

ctory) e

cc.�

La cla

sse RandomAccessFile

, che risp

etto

ai se

mplici flu

ssi offre

un “cu

rsore”per il p

osizio

namento all’in

terno del file

, più

i relativi

metodi per la

sua gestio

ne (se

ek, skip

ecc.)

46

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�FileInputStre

am

èla

classe

deriva

ta

che

rappresenta il

concetto

di

sorgente di

byte

aggancia

ta a un file

�il

nome del file

da aprire

è

passa

to come

parametro

al co

strutto

re di FileInputStre

am

�in alternativa

si

può passa

re al costru

ttore un

oggetto

File (o un FileDescrip

tor)

costru

ito in

precedenza

Flussi p

er i file

Page 24: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

47

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Per aprire

un file

binario

in lettu

ra si

crea un

oggetto

di cla

sse FileInputStre

am, specifica

ndo il

nome del file

all’a

tto della cre

azio

ne.

�Per le

ggere dal file

si usa poi il m

etodo re

ad() ch

e

perm

ette

di le

ggere uno o piùbyte

�restitu

isce il b

yte letto

come intero fra

0 e 255

�se lo stre

am è

finito

, restitu

isce -1

�se non ci so

no byte

, ma lo

stream non è

finito

, rim

ane in

atte

sa dell'a

rrivo di un byte

.�

Poich

éè

possib

ile che le operazio

ni su stre

am

fallisca

no per

varie

cause,

tutte

le operazio

ni

posso

no lancia

re ecce

zioni, q

uindi n

ecessità

di try /

catch Flussi p

er i file

–Lettu

ra byte

48

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class Lettu

raDaFileB

inario

{public static vo

id m

ain(Strin

g arg

s[]){FileIn

putStream

is = null;

try {is =

new

FileInputStream

(args[0

]);}

catch(FileN

otFo

undExcep

tion e){

System

.out.p

rintln

("File non tro

vato");

System

.exit(1);

}// ... lettu

ra ...}

}

Flussi p

er i file

–Lettu

ra byte

Page 25: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

49

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

La fa

se di le

ttura:

...try {

int x =

is.read();

int n

= 0;

while (x>

=0) {

System

.out.p

rint(" " +

x); n++;

x = is.read

();}System

.out.p

rintln

("\nTotale b

yte: " + n);

} catch(IO

Excep

tion ex){

System

.out.p

rintln

("Erro

re di in

put");

System

.exit(2);

}

qua

nd

o lo

stre

am

term

ina,

read

() restitu

isce -1

Flussi p

er i file

–Lettu

ra byte

50

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esem

pio d’uso:

C:\tem

p>java Lettu

raDaFileB

inario

questio

n.gif

Il risultato

:71 73 70 56 57 97 32 0 32 0 161 0 0 0 0 0 255 255 25

5

…………..

Totale b

yte: 190

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2007-2008

Flussi p

er i file

–Lettu

ra byte

Page 26: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

51

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Lettu

ra di dati d

a file

binario

�Per

leggere da un file

binario

occo

rre un

FileInputStre

am, ch

e però co

nsente so

lo di le

ggere

un byte

o un arra

y di byte

�Volendo le

ggere dei flo

at, in

t, double, b

oolean, …

èmolto più

pratico

un DataInputStre

am, che ha

metodi id

onei

�Si

incapsula

FileInputStre

am

dentro

un

DataInputStre

am

Flussi p

er i file

–Lettu

ra byte

52

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class E

sempio2 {

public static vo

id m

ain(Strin

g arg

s[]){FileIn

putStream

fin = null;

try {fin = new

FileInputStream

("Prova.d

at");}catch

(FileNotFo

undExcep

tion e){

System

.out.p

rintln

("File non tro

vato");

System

.exit(3);

}// co

ntin

ua...

Flussi p

er i file

–Lettu

ra byte

Page 27: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

53

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

DataIn

putStream

is = new

DataIn

putStream

(fin);

float f2

; char c2

; boolean

b2; d

ouble d

2;

int i2

;try {

f2 = is.read

Float(); b

2 = is.read

Boolean

();d2 = is.read

Double(); c2

= is.read

Char();

i2 = is.read

Int(); is.close();

System

.out.p

rintln

(f2 + ", " +

b2 +

", "+ d2 +

", " + c2

+ ", " +

i2);

} catch (IO

Excep

tion e){

System

.out.p

rintln

("Erro

re di in

put");

System

.exit(4);

}}

Flussi p

er i file

–Lettu

ra byte

54

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�FileOutputStre

am è

la cla

sse deriva

ta che

rappresenta il

concetto

di disp

ositivo

di uscita

aggancia

to a un file

�il

nome del file

da aprire

è

passa

to come

parametro

al co

strutto

re di FileOutputStre

am

�in alternativa

si può passa

re al co

strutto

re un

oggetto

File (o un FileDescrip

tor)

costru

ito in

precedenza FileOutputStre

am

Flussi p

er i file

–Scrittu

ra byte

Page 28: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

55

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Per a

prire

un file

binario

in scrittu

ra si cre

a un oggetto

di

classe

FileOutputStre

am, sp

ecifica

ndo il n

ome del file

all’a

tto

della cre

azio

ne

�un secondo parametro

opzio

nale,

di

tipo boolean,

perm

ette

di ch

iedere l’a

pertu

ra in m

odo append

�Per scrive

re su

l file si u

sa il m

etodo w

rite() ch

e perm

ette

di scrive

re uno o piùbyte

�scrive

l’intero (0

-255) p

assa

togli co

me parametro

�non re

stituisce

nulla

�Poich

éèpossib

ile ch

e le

operazio

ni su

stream fa

lliscano per

varie

cause, tu

tte le

operazio

ni p

osso

no la

ncia

re ecce

zioni,

quindi necessità

di try / ca

tch

Flussi p

er i file

–Scrittu

ra byte

56

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class S

critturaS

uFileB

inario {

public static vo

id m

ain(Strin

g arg

s[]){FileO

utputStream

os =

null;

try {os =

new

FileOutputStream

(args[0

]);}catch

(FileNotFo

undExcep

tion e){

System

.out.p

rintln

("Imposs. ap

rire file");System

.exit(1);

}// ... scrittu

ra ...}

}

Per a

prirlo

in m

oda

litàappen

d:

File

Ou

tpu

tStre

am

(arg

s[0

],true)

Flussi p

er i file

–Scrittu

ra byte

Page 29: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

57

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esempio: scrittu

ra di alcu

ni byte

a sce

lta...try {

for (in

t x=0; x<

10; x+

=3) {

System

.out.p

rintln

("Scrittu

ra di " +

x);os.w

rite(x);}

} catch(IO

Excep

tion ex){

System

.out.p

rintln

("Erro

re di ou

tput");

System

.exit(2);

}...

Flussi p

er i file

–Scrittu

ra byte

58

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esem

pio d’uso:

C:\tem

p>java S

critturaS

uFileB

inario

prova.d

atIl risu

ltato:

Scrittu

ra di 0

Scrittu

ra di 3

Scrittu

ra di 6

Scrittu

ra di 9

Contro

llo:

C:\tem

p>dir p

rova.d

at16/01/01 prova.d

at 4 byte

Esperim

enti

Provare a rileg

gere il file co

n il p

rogram

ma p

recedente

Aggiungere altri b

yte riapren

do il file in

modo ap

pend

Flussi p

er i file

–Scrittu

ra byte

Page 30: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

59

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Scrittu

ra di dati su

file binario

�Per

scrivere

su

un

file

binario

occo

rre

un

FileOutputStre

am, ch

e però co

nsente so

lo di scrive

re un

byte

o un arra

y di byte

Volendo scrive

re dei float,

int,

double, boolean, …

èmolto più

pratico

un D

ataOutputStre

am, ch

e ha m

etodi

idonei

�Si

incapsula

FileOutputStre

am

dentro

un

DataOutputStre

am

Flussi p

er i file

–Scrittu

ra byte

60

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class E

sempio1 {

public static vo

id m

ain(Strin

g arg

s[]){FileO

utputStream

fs = null;

try {fs =

new

FileOutputStream

("Prova.d

at");}

catch(IO

Excep

tion e){

System

.out.p

rintln

("Apertu

ra fallita");System

.exit(1);

}// co

ntin

ua...

Flussi p

er i file

–Scrittu

ra byte

Page 31: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

61

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

DataO

utputStream

os =

new

DataO

utputStream

(fs);float f1 =

3.1415F; ch

ar c1 = ’X’;

boolean

b1 =

true; d

ouble d

1 = 1.4142;

try {os.w

riteFloat(f1); o

s.writeB

oolean

(b1);

os.w

riteDouble(d

1); os.w

riteChar(c1

);os.w

riteInt(1

2); o

s.close();}

catch (IO

Excep

tion e){

System

.out.p

rintln

("Scrittu

ra fallita");System

.exit(2);

}}

}

Flussi p

er i file

–Scrittu

ra byte

62

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Random Acce

ss Files

�La cla

sse RandomAcce

ssFiles

rappresenta un file

con un curso

re

utilizza

to per l’a

ccesso

dire

tto�

RandomAcce

ssFiles,

non è

sotto

classe

di

nessu

na InputStre

am,

OutputStre

am o Reader o

Write

r, in quanto im

plementa fu

nzio

nalità

sia

di input che di output;

implementa anche le interfa

cce DataInpute

DataOutput per i tip

i prim

itivi, oltre

che i metodi read e write

delle

classi d

ei flu

ssi; un oggetto

flusso

non è

tutta

via so

stituibile co

n uno

RandomAcce

ssFile

�I m

etodi so

no:

void seek(lo

ng pos) th

rows IO

Excep

tion;

�offse

t dal’in

izio del R

andomAcce

ssFile.

long getFileP

ointer() th

rows IO

Excep

tion;

�Rito

rna il co

rrente offse

t, in byte

s, dall’in

izio del file

.long len

gth() th

rows IO

Excep

tion

�Rito

rna la lunghezza

del file

.Void setLen

gth(lo

ng new

Length) th

rows IO

Excep

tion

�Consente di va

riare la

dimensio

ne del file

, riempendolo di b

yte se

piùcorto

o tro

ncandolo se

piùlungo

Page 32: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

63

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Cosa ca

mbia risp

etto

agli stre

am binari ?

�Il

file di testo

si

apre costru

endo un oggetto

FileReader o

FileWrite

r, rispettiva

mente

�read()e

write

() leggono/scrivo

no un int

che

rappresenta un ca

ratte

re UNICODE

�rico

rda: u

n ca

ratte

re U

NICODE è

lungo due

byte

�read() re

stituisce

-1 in ca

so di fin

e stre

am

�Occo

rre dunque un ca

st esplicito

per co

nvertire

il caratte

re UNICODE in int e

viceversa

Flussi p

er i file

–Caratte

ri

64

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Gli stre

am di b

yte so

no più

antich

i e di live

llo più

basso

risp

etto

agli stre

am di ca

ratte

ri�

Un ca

ratte

re UNICODE è

una se

quenza di due byte

�Gli

stream di byte

esisto

no da Java 1.0, quelli

di

caratte

ri da Ja

va 1.1 ERGO, le

classi e

sistenti fin

da

Java 1.0 usano stre

am di b

yte anche quando sa

rebbe

meglio usare stre

am di caratte

ri ma i caratte

ri potre

bbero non esse

re sempre tra

ttati

in modo

coerente (in

applica

zioni che operano con dive

rse

codifich

e, m

agari su

piatta

form

e dive

rse, o

via re

te) .

�Alcu

ni ca

nali d

i comunica

zione so

no stre

am di b

yte m

a a

volte si

devono usare per invia

re / rice

vere caratte

ri (ca

so tip

ico: stre

am di re

te -

si invia

no G

IF m

a anche

testo

)

Flussi p

er i file

–Caratte

ri

Page 33: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

65

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

CONSEGUENZA

�Occo

rre sp

esso

poter re

interpretare uno stre

am

di b

yte co

me re

ader / w

riter q

uando opportu

no

(cioèquando tra

smette

caratte

ri)�

Esisto

no due cla

ssi "in

capsulanti"

progetta

te

proprio

per q

uesto

scopo:

�InputStre

amReader

che

reinterpreta

un

InputStre

am co

me un Reader

�OutputStre

amWrite

r che

reinterpreta

un

OutputStre

am co

me un W

riter

66

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class Lettu

raDaFileD

iTesto {

public static vo

id m

ain(Strin

g arg

s[]){FileR

eader r =

null;

try {r =

new

FileRead

er(args[0

]);}catch

(FileNotFo

undExcep

tion e){

System

.out.p

rintln

("File non tro

vato");

System

.exit(1);

}// ... lettu

ra ...}

}

Flussi p

er i file

–Lettu

ra ca

ratte

ri

Page 34: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

67

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

La fase di lettu

ra:...try {

int n

=0, x =

r.read();

while (x>

=0) {

char ch

= (ch

ar) x;System

.out.p

rint(" " +

ch); n

++;

x = r.read

();}System

.out.p

rintln

("\nTotale caratteri: " +

n);

} catch(IO

Excep

tion ex){

System

.out.p

rintln

("Erro

re di in

put");

System

.exit(2);

}

Cast e

splicito

da int a

char -

Ma so

lo se

èsta

todavve

ro letto

un ca

ratte

re(cio

èse non è

stato letto

-1)

Flussi p

er i file

–Lettu

ra ca

ratte

ri

68

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Esempio d’uso:

C:\te

mp>java Le

tturaDaFileDiTesto

prova.txt

Il risultato:

N e l m

e z z o

d e l c a

m m

i n d i n

o s t r a

v i t aTotale ca

ratte

ri: 35

Analogo esercizio

può esse

re svo

lto per la

scrittura su

file di

testo

. Flussi p

er i file

–Lettu

ra ca

ratte

ri

Page 35: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

69

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Video e ta

stiera so

no ra

ppresentati d

ai d

ue oggetti sta

tici Syste

m.in e Syste

m.out

�Poich

éesisto

no fin da Java 1.0 (quando Reader e

Write

r non esiste

vano), e

ssi sono fo

rmalmente degli

stream di byte

…�

Syste

m.in è

form

almente un In

putStre

am

�Syste

m.out è

form

almente un OutputStre

am

�ma in re

altà

sono stre

am di ca

ratte

ri.�

Per

assicu

rare che i caratte

ri UNICODE sia

no ben

interpretati o

ccorre

quindi in

capsularli risp

ettiva

mente in

un Reader e in un Write

r e specifica

re il

characte

r encoding opportu

no.

Flussi p

er i file

–I/O

console

70

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

�Syste

m.in può esse

re “in

terpretato come un Reader"

incapsulandolo dentro

a un In

put-S

treamReader

�Syste

m.out

può esse

re “in

terpretato come un Write

r" incapsulandolo dentro

a un OutputStre

amWrite

r�

Tipica

mente:

InputStream

Read

er tastiera =new

InputStream

Read

er(System

.in);

OutputStream

Writer vid

eo =

new

OutputStream

Writer(S

ystem.out);

Flussi p

er i file

–I/O

console

Page 36: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

71

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

import java.io.*

;public class C

onsoleIn

put {

public static vo

id m

ain(Strin

g[] arg

s) {try {// crea u

n oggetto

ins e lo

colleg

a alla console.

InputStream

Read

er inStream

= new

InputStream

Read

er(System

.in);

Buffered

Read

er ins =

new

Buffered

Read

er(inStream

);

// Legge il n

ome d

el fle di output.

System

.out.p

rint("E

nter ou

tput file n

ame: ");

Strin

g ou

tFileNam

e = ins.read

Line();

Flussi p

er i file

–I/O

console

72

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

// crea un oggetto

outs --

output file.

FileWriter o

utStream

= new

FileWriter(o

utFileN

ame);

Prin

tWriter o

uts =

new

Prin

tWriter(o

utStream

);

// legge il n

umero

di lin

ee del file.

System

.out.p

rintln

("How m

any d

ata lines?");

int n

umLin

es = In

teger.p

arseInt(in

s.readLin

e());

// legge le rig

he d

alla console e le scrive su

l file di output

System

.out.p

rintln

("Type " +

numLin

es + " lin

es:");for (in

t lineC

ount =

0; lin

eCount <

numLin

es; lineC

ount++) {

Strin

g dataLin

e = ins.read

Line();

outs.p

rintln

(dataLin

e);}

Flussi p

er i file

–I/O

console

Page 37: Il package java.io -lezione 09utenti.dieei.unict.it/.../lezione09_input_output.pdf · Per utilizzare una qualsiasi classe di I/O occorre effettuare l’import di java.io.* (o di una

73

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

// scrive un m

essaggio su

lla console e ch

iude il file

System

.out.p

rintln

(numLin

es + “rig

he in

serite nel file”+

outFileN

ame);

ins.clo

se();outs.clo

se();}catch

(IOExcep

tion ex) {

System

.out.p

rintln

("i/o error: " + ex.g

etMessag

e());ex.p

rintStackT

race();}catch

(NumberFo

rmatE

xceptio

n ex) {

System

.out.p

rintln

(ex.getM

essage());

ex.prin

tStackT

race();}

}}

Flussi p

er i file

–I/O

console

74

A. Longheu –Linguaggi M

-Z –Ing. In

f. 2008-2009

Flussi p

er i file

–I/O

console