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
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"
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
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
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
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
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
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)
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)
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)
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)
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)
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Top Related