Java Course - UniCam - Computer Science Division

Linguaggio Java
(Base)
marzo 2000
Linguaggio Java
Ing. Thimoty Barbieri
1/92
So mmario
P ER C OMINCIARE .............................................................................5
SCRITTURA DEL SORGENTE.........................................................................................................................................................................6
COMPILAZIONE .............................................................................................................................................................................................7
ESECUZIONE ..................................................................................................................................................................................................8
VARIABILI......................................................................................................................................................................................................9
STRUTTURE DI CONTROLLO ......................................................................................................................................................................10
ARRAY..........................................................................................................................................................................................................11
STRINGHE.....................................................................................................................................................................................................12
CLASSI ED O GGETTI .......................................................................13
ESEMPIO .......................................................................................................................................................................................................14
ESEMPIO .......................................................................................................................................................................................................15
MODIFICATORI ............................................................................................................................................................................................16
COSTRUTTORI ..............................................................................................................................................................................................17
ESEMPIO COSTRUTTORI .............................................................................................................................................................................18
ESEMPIO INVOCAZIONE .............................................................................................................................................................................19
METODI ........................................................................................................................................................................................................20
PASSAGGIO PER VALORE ...........................................................................................................................................................................21
PASSAGGIO DI OGGETTI.............................................................................................................................................................................22
ESEMPIO DI PASS BY VALUE .....................................................................................................................................................................23
ULTERIORI COMMENTI ..............................................................................................................................................................................24
ULTERIORI COMMENTI ..............................................................................................................................................................................25
IL GARBAGE COLLECTOR..........................................................................................................................................................................26
IL GARBAGE COLLECTOR..........................................................................................................................................................................27
CLASSI NESTATE.........................................................................................................................................................................................28
CLASSI INNER..............................................................................................................................................................................................29
EREDITARIETÀ ................................................................................30
DIFFERENZA TRA OVERLOADING E OVERRIDING..................................................................................................................................31
USO DI PROTECTED .....................................................................................................................................................................................32
USO DEI COSTRUTTORI ..............................................................................................................................................................................33
LA CLASSE OBJECT .....................................................................................................................................................................................34
USO DI CLASSI ANONIME ...........................................................................................................................................................................35
CLASSI E METODI ASTRATTI......................................................................................................................................................................36
INTERFACCE ...................................................................................37
ESTENSIONE ATTRAVERSO LE INTERFACCE ............................................................................................................................................38
ESEMPIO DI ESTENSIONE CON INTERFACCE..............................................................................................................................................1
RISOLUZIONE DI CONFLITTI......................................................................................................................................................................40
G ESTIONE DELLE ECCEZIONI ........................................................41
Linguaggio Java
Ing. Thimoty Barbieri
2/92
CREAZIONE DI ECCEZIONI.........................................................................................................................................................................42
LANCIO DI ECCEZIONI ................................................................................................................................................................................43
TRY , CATCH E FINALLY..............................................................................................................................................................................44
LA CLASSE S TRING .........................................................................45
CONVERSIONI DA ALTRI TIPI A STRINGA .................................................................................................................................................46
CONVERSIONE DA STRINGA A ALTRI TIPI................................................................................................................................................47
STRINGHE ED A RRAY DI CHAR..................................................................................................................................................................48
I THREAD ........................................................................................49
CREAZIONE DI THREAD .............................................................................................................................................................................50
CREAZIONE DI THREAD .............................................................................................................................................................................51
UN ESEMPIO DI THREAD............................................................................................................................................................................52
ESEMPIO (CONTINUA ) ................................................................................................................................................................................53
SINCRONIZZAZIONE....................................................................................................................................................................................54
ESEMPIO DI SINCRONIZZAZIONE..............................................................................................................................................................55
LOCK SU CODICE .........................................................................................................................................................................................56
WAIT .............................................................................................................................................................................................................57
CONDIZIONI DI USO DI WAIT ......................................................................................................................................................................58
NOTIFY E NOTIFYALL .................................................................................................................................................................................59
SCHEDULAZIONE.........................................................................................................................................................................................60
PRIORITÀ......................................................................................................................................................................................................61
SLEEP E YIELD..............................................................................................................................................................................................62
CONDIZIONE DI DEADLOCK ......................................................................................................................................................................63
TERMINAZIONE DI UN THREAD.................................................................................................................................................................64
ATTESA DI TERMINAZIONE DI THREAD....................................................................................................................................................65
ESEMPIO DI JOIN .........................................................................................................................................................................................66
RUNNABLE...................................................................................................................................................................................................67
I PACKAGE ......................................................................................68
PACKAGE - ESEMPIO..................................................................................................................................................................................69
USO DI J AVAD OC ............................................................................70
COMMENTI PER JAVA DOC.........................................................................................................................................................................71
TAG PER JAVADOC .....................................................................................................................................................................................72
ESEMPIO DI JAVADOC................................................................................................................................................................................73
UTILITÀ ...........................................................................................74
ENUMERATION ............................................................................................................................................................................................75
VECTOR........................................................................................................................................................................................................76
DICTIONARY................................................................................................................................................................................................77
HASHTABLE .................................................................................................................................................................................................78
RANDOM ......................................................................................................................................................................................................79
STRINGTOKENIZER.....................................................................................................................................................................................80
Linguaggio Java
Ing. Thimoty Barbieri
3/92
I/O E N ETWORKING .......................................................................81
METODI STANDARD...................................................................................................................................................................................82
USO DI STREAM FILE (BYTE ORIENTED).................................................................................................................................................83
RANDOM A CCESSFILE ................................................................................................................................................................................84
NETWORKING..............................................................................................................................................................................................85
CREAZIONE DI UN SOCKET DI TRASMISSIONE........................................................................................................................................86
SCRITTURA SU SOCKET CLIENT................................................................................................................................................................87
SCRITTURA SU SOCKET CLIENT (2)..........................................................................................................................................................88
USO DI SOCKET SERVER............................................................................................................................................................................89
APERTURA STREAM PER SOCKET .............................................................................................................................................................90
LETTURA E STAMPA SU STREAM DEI SOCKET........................................................................................................................................91
PACKAGE S TANDARD .....................................................................92
Linguaggio Java
Ing. Thimoty Barbieri
4/92
Per C ominciare
Java è un linguaggio ad oggetti puro.
Per lavorare e compilare sorgenti Java occorre installare il JDK
(Java Development Kit).
Il JDK contiene
I tool di compilazione e debugging
La JVM (Java Virtual Machine)
La JVM simula una piattaforma hardware in grado di compilare
il particolare compilato Java, denominato bytecode.
Pertanto, qualsiasi macchina che disponga di una JVM
installata è in grado di eseguire in modo corretto codice Java.
La JVM può anche essere compresa all'interno di un browser
internet. In questo modo è possibile eseguire codice mobile
(Applet).
Linguaggio Java
Ing. Thimoty Barbieri
5/92
Scrittura del So rgente
I sorgenti Java sono file con estensione .java.
Ciascun file .java contiene il codice relativo ad una classe.
Listato di HelloWorld.java:
class HelloWorld {
public static void main(String[]args)
{
// Se si hanno problemi con questo,
// la situazione è critica
System.out.println("Hello World!");
}
}
Il codice Java è case sensitive.
Il nome del file .java deve coincidere con il nome della classe.
Linguaggio Java
Ing. Thimoty Barbieri
6/92
Com pilazio ne
La compilazione avviene invocando da linea di comando il
compilatore java compreso nel JDK (javac):
> javac HelloWorld.java
Se tutto è corretto, viene creato un file con lo stesso nome e
l'estensione .class.
Questo file contiene il compilato bytecode eseguibile da
qualsiasi JVM su qualsiasi piattaforma.
La forza di Java sta nella sua portabilità.
Si compila una volta, si esegue su qualsiasi piattaforma con
JVM.
Linguaggio Java
Ing. Thimoty Barbieri
7/92
Esecuzione
L'esecuzione può avvenire invocando la JVM:
> java HelloWorld
Per funzionare, la JVM si appoggia a delle librerie che vengono
consultate a runtime.
Queste librerie sono anch'esse dei .class raccolte in un unico file
compresso.
La variabile di ambiente CLASSPATH contiene l'elenco dei path a
tutte le .class di libreria o ai file compressi di libreria che la JVM
può utilizzare.
Impostazione tipica di CLASSPATH:
CLASSPATH =
.;c:\jdk1.2.2\lib\classes.zip;d:\devel\java\myclasses.jar
Linguaggio Java
Ing. Thimoty Barbieri
8/92
V ariabili
Java dispone dei seguenti tipi primitivi:
boolean
char (16 bit unicode)
byte (signed int 8 bit)
short (signed int 16 bit)
int (signed int 32 bit)
long (signed int 64 bit)
float (floating point 32 bit)
double (floating point 64 bit)
Assegnazione:
int a = 5;
Confronto:
if (a == 5) …
Costanti:
static final double ? = 3.1416;
(Java lavora in Unicode)
Linguaggio Java
Ing. Thimoty Barbieri
9/92
Strutture di Co ntrollo
Classiche strutture di controllo di flusso:
if (condizione)
{ true block }
else { false block }
for (init; condition; increment) { code }
while (condition) { block }
Incrementi: i++, i += 1, i = i + 1
Il blocco { code } delimita una zona di scoping, anche se non è
legato a nessuna struttura di controllo.
Linguaggio Java
Ing. Thimoty Barbieri
10/92
Array
Gli array si numerano da zero, e sono una lista di elementi tutti
del medesimo tipo.
La dichiarazione usa le quadre, l'assegnazione di valori le
graffe.
Cards[] cards = new Card[DECK_SIZE];
int numbers = new int[];
numbers = { 1, 2, 3, 4, 5 };
int 3dpos[][][]; // array 3D
int unNumero = numbers[2]; // unNumero = 3
Metodi applicabili:
Array.length per conoscerne la lunghezza
Linguaggio Java
Ing. Thimoty Barbieri
11/92
Stringhe
Il tipo non primitivo String consente di trattare le stringhe.
// costante esplicita
System.out.println("Java is cool");
// Matematica tra stringhe
String myName = "Petronius";
myName += "is my name.";
// alcuni metodi utili
int lunghstringa = myName.length();
myName.trim(); // taglia gli spazi in // testa
e in coda
// confronto case insensitive
if (myName.equalsIgnoreCase("Arbiter")
// confronto case sensitive
if (myName.equals("Arbiter"))
Linguaggio Java
Ing. Thimoty Barbieri
12/92
C lassi ed Oggetti
Come i tutti i linguaggi ad oggetti, la classe descrive una
generica entità, mediante la definizione dei suoi metodi e dei
suoi attributi.
Da ciascuna classe vengono fatte derivare una o più istanze,
dette oggetti. Esse differiscono perché ciascuna istanza
conserva il proprio stato.
I metodi invocati su una determinata istanza hanno l'effetto di
modificare lo stato di quella determinata istanza.
L'istanzazione avviene mediante la parola new, che invoca il
costruttore, un particolare metodo con lo stesso nome della
classe.
Il punto referenzia la chiamata al metodo o al campo.
Linguaggio Java
Ing. Thimoty Barbieri
13/92
Esempio
class Point {
public double x, y;
public
double
double
return
double distance(Point that){
xdiff = x – that.x;
ydiff = y – that.y;
Math.sqrt(xdiff^2+ydiff^2);
}
public void move(double x, double y) {
this.x = x;
this.y = y;
}
}
L'uso di this in Point.move disambigua il nome dei campi da
quello dei parametri formali del metodo.
Linguaggio Java
Ing. Thimoty Barbieri
14/92
Esempio
L'utilizzo di questa classe ne prevede l'istanziazione:
Point p1 = new Point();
// il costruttore di questa classe è //
implicito
p1.x = 12.0;
// questo è lecito perché il campo è // public
p1.move(14.0, 15.0);
// invoca un metodo su p1
Point p2 = new Point();
p2.x = 14.0;
p2.y = 16.0;
// Invoca il calcolo della distanza
p1.distance(p2);
Linguaggio Java
Ing. Thimoty Barbieri
15/92
Mo dificato ri
public rende un metodo o un campo accessibili a tutte le altre
classi
private rende un metodo o un campo accessibile solo a metodi
della medesima classe
protected rende un metodo o un campo accessibile solo a
metodi della medesima classe o di una sottoclasse nel
medesimo package
private protected rende metodi e campi accessibili solo alla
medesima classe e sua sottoclasse
friendly rende il campo e metodo accessibili ad altre classi
dello stesso package, ma non alle sottoclassi
final rende il campo non modificabile
static rende il campo o il metodo di classe e non di istanza
(vengono messi "a comune")
Se non si specifica nessun modificatore, la visibilità è all'interno
di tutte le classi (e sottoclassi) dello stesso package.
Linguaggio Java
Ing. Thimoty Barbieri
16/92
Co strutto ri
Ogni oggetto appena creato ha uno stato iniziale. I costruttori
consentono di avere una inizializzazione di tipo complesso,
perché sono eseguiti all'atto dell'istanziazione dell'oggetto.
Se non si specifica nessun costruttore, la classe è detta no-arg
ed ha un costruttore implicito vuoto.
È possibile fare un overloading del costruttore specificandone
più di uno, tutti con segnature diverse. Quello invocato
dipende dall'utilizzo della new.
I costruttori sono utili per assicurarsi che le inizializzazioni di
stato siano fatte in modo corretto, scaricando di questa
responsaibilità l'utilizzatore della classe, che non è tenuto a
conoscere i campi della classe (information hiding).
Linguaggio Java
Ing. Thimoty Barbieri
17/92
Esem pio Co strutto ri
class Body {
public long idNum;
public String name = "(unnamed)";
public Body orbits = null;
private static long nextID = 0;
// costruttore no.arg
Body() {
IdNum = nextID++;
}
// overload del costruttore
Body(String bodyName, Body orbitsAround) {
this();
name = bodyName;
orbits = orbitsAround;
} }
Linguaggio Java
Ing. Thimoty Barbieri
18/92
Esempio Invocazione
Body sun = new Body();
sun.name = "Sol" // possibile ma viola
// il principio di info hiding
Body earth = new Body();
earth.name = "Earth";
earth.orbits = sun; // passa un Body
// utilizzando il nuovo costruttore
// rispettiamo information hiding:
Body sun = new Body("Sol", null);
Body sun = new Body("Earth", sun);
Linguaggio Java
Ing. Thimoty Barbieri
19/92
Meto di
Ciascuna classe mette a disposizione metodi invocabili con
l'operatore . sull'istanza, a meno che non si tratti di metodi
statici.
I metodi statici sono invocati con il loro percorso di libreria (ad
es. java.Math.sqrt(x)).
I metodi accettano parametri in ingresso e possono ritornare
un valore. Occorre sempre specificare il valore ritornato:
void
nessun valore ritornato
<type> altro tipo di valore ritornato
Metodi non void devono obbligatoriamente terminare in ogni
caso con un return corrispondente al tipo di ritorno dichiarato.
Inoltre è possibile associare ai metodi gli opportuni modificatori
di visibilità.
Linguaggio Java
Ing. Thimoty Barbieri
20/92
Passaggio per Valo re
Tutti i parametri sono passati ai metodi per valore.
In Java non esiste in modo esplicito il concetto di puntatore,
che il programmatore non può utilizzare direttamente.
I valori delle variabili parametro in un metodo sono copie dei
valori usati come argomenti all'atto dell'invocazione. Il metodo
dunque riceve una copia del valore dell'argomento passato.
Quando si istanziano oggetti, l'identificatore a sinistra della
new riceve un valore che rappresenta il riferimento all'oggetto
all'interno dello heap.
Linguaggio Java
Ing. Thimoty Barbieri
21/92
Passaggio di O ggetti
Passando un oggetto come parametro, ciò che viene passato
non è l'oggetto ma il valore del riferimento.
In questo modo all'interno del metodo si può modificare a
quale oggetto il parametro si riferisce senza influenzare il
riferimento che è stato ricevuto nel passaggio.
Tuttavia, se si cambia qualsiasi campo dell'oggetto a cui il
valore si riferisce, o se se ne invocano i metodi per cambiarne
lo stato, l'oggetto viene cambiato per ogni parte del
programma che contiene un riferimento ad esso.
Linguaggio Java
Ing. Thimoty Barbieri
22/92
Esempio di Pass by V alue
class PassRef {
public static void main(String[] args) {
Body sirius = new Body("Sirius", null);
System.out.println("bef:"+sirius);
commonName(sirius);
System.out.println("aft:"+sirius);
}
public static void commonName(Body bodyRef)
{
bodyRef.name = "Dog Star";
bodyRef = null;
}
}
bef: 0 (Sirius)
aft: 0 (Dog Star)
Linguaggio Java
Ing. Thimoty Barbieri
23/92
Ulterio ri Co mmenti
Diffidate da coloro che sostengono che Java passa i parametri
by reference (per riferimento). Java passa PER VALORE IL
RIFERIMENTO, ed è l'unica modalità di passaggio in Java.
Passando per riferimento, l'argomento passato alla funzione è
riferimento diretto al valore originale e non una copia.
Se la funzione modifica dunque il parametro, il valore viene
cambiato anche nel codice chiamante, perché la funzione e il
codice chiamante usano lo stesso slot di memoria.
Con questo meccanismo, la linea bodyRef = null avrebbe
l'effetto di cancellare l'oggetto sirius.
Linguaggio Java
Ing. Thimoty Barbieri
24/92
Ulterio ri Co mmenti
Invece il passaggio per valore del riferimento impedisce alla
funzione chiamata di distruggere l'oggetto utilizzato dalla
chiamante.
Poiché vengono fatte DUE COPIE dello stesso riferimento, che
punta allo stesso oggetto, i cambiamenti fatti passando
attraverso uno dei due riferimenti sono visibili sia alla
chiamante che al chiamato, ma la distruzione di uno dei due
valori del riferimento non impatta sull'altra copia del
riferimento.
Linguaggio Java
Ing. Thimoty Barbieri
25/92
Il Garbage Co llecto r
Quando un oggetto istanziato, che occupa memoria nello
heap, non è più raggiungibile da alcuna porzione del codice
(tutti i riferimenti ad esso sono a null), lo spazio che occupa
viene recuperato.
Il programmatore non ha alcun controllo su questo: la
liberazione della memoria viene eseguita in background da un
apposito thread detto garbage collector.
In questo modo si elimina il problema delle dangling
references, vale a dire non è possibile che il programmatore
cancelli oggetti a cui parti del programma si riferiscono ancora.
Linguaggio Java
Ing. Thimoty Barbieri
26/92
Il Garbage Co llecto r
Anche se Java fa molto lavoro per il programmatore, tuttavia è
buona pratica programmare in modo ordinato, mettendo a null
tutti gli oggetti di cui non si ha bisogno.
Il metodo finalize() in un oggetto viene eseguito appena prima
che il garbage collector si inneschi per cancellare questo
oggetto.
La resurrection (autoinstanziazione da dentro la finalize) è
sconsigliata.
Linguaggio Java
Ing. Thimoty Barbieri
27/92
Classi nestate
È possibile definire una classe all'interno di una classe,
ottenendo classi annidate.
Questa tecnica è utile per rappresentare strutture fortemente
correlate tra loro.
Spesso le classi annidate sono statiche (hanno significato
analogo ad uno struct del C in questo senso):
public class BankAccount {
private long number;
private long balance;
public static class Permissions {
public boolean canDeposit,
canWithdraw,
canClose;
} }
Ad esempio:
oneBankAccount.Permissions.canDeposit = true;
Linguaggio Java
Ing. Thimoty Barbieri
28/92
C lassi inner
Se la classe annidata non è statica, essa è detta inner.
È possibile indicare questa sottoclasse con un this nestato.
public class BankAccount {
public class Action {
private String act;
. . .
return BankAccount.this.act;
}
Action lastAct = this.new Action()
}
Linguaggio Java
Ing. Thimoty Barbieri
29/92
Ereditarietà
Tutte le classi Java implicitamente sono classi derivate da una
superclasse Object, che contiene metodi propri di tutti gli
oggetti Java in quanto tali.
Il tipo Object può dunque essere usato in polimorfismo con
qualsiasi oggetto Java.
L'ereditarietà viene indicata esplicitamente mediante la parola
chiave extends.
class Pixel extends Point {
Color color;
public void clear() {
super.clear();
color = null;
} }
Linguaggio Java
Ing. Thimoty Barbieri
30/92
D ifferenza tra Overloading e Overriding
Porre attenzione alla differenza:
l'overloading di metodi consiste nello specificare più volte uno
stesso metodo in una classe, tutti con segnature differenti.
class Point {
int x, y;
Point() { x=0; y=0; }
Point (int initx, int inity)
{ x = initx; y = inity; }
public void clear() { x=0; y=0; } }
l'overriding consiste nel re-implementare un metodo ereditato
dalla superclasse nella sottoclasse, con il vincolo di
mantenerne identica la segnatura.
Class Pixel extends Point {
int color;
public void clear()
{ super.clear(); color=0; } }
Linguaggio Java
Ing. Thimoty Barbieri
31/92
Uso di pro tected
Dessert
Torta
Pasticcino
Crostata
Un identificatore protected può essere acceduto da una classe
tramite un riferimento che abbia almeno lo stesso tipo o
sottotipo della classe. Ad esempio:
La classe Dessert ha un campo protected int calorie; esso
viene ereditato sia da Torta che da Pasticcino.
Tuttavia il codice di Torta può accedere a calorie solamente
con un riferimento di tipo Torta o di tipo di una sottoclasse
(Crostata).
I campi protetti di una classe non possono essere acceduta al
di fuori della gerarchia di ereditarietà cui appartiene la classe
di accesso.
Linguaggio Java
Ing. Thimoty Barbieri
32/92
Uso dei C ostruttori
Il costruttore di una classe che estende una superclasse ricade
nelle seguenti regole:
È possibile utilizzare super() per invocare il costruttore noarg della superclasse. Si può anche invocare super() con i
parametri per utilizzare un costruttore diverso in overload.
Se non usa esplicitamente una super(), viene invocato
implcitamente il costruttore super() no-arg della
superclasse.
Se la superclasse non dispone di un costruttore no-arg
esplicito, bisogna invocare esplicitamente un altro
costruttore di superclasse
In alternativa si può invocare un altro costruttore della
stessa classe (con this()).
In ogni caso l'uso di super() deve essere alla prima linea di
codice del costruttore della sottoclasse.
Linguaggio Java
Ing. Thimoty Barbieri
33/92
La classe Object
Tutte le classi che direttamente o indirettamente ereditano da
Object dispongono dei seguenti metodi:
boolean equals(Object obj)
consente di confrontare per uguaglianza due oggetti
public int hashCode()
Ritorna un codice ID unico da usare nelle tabelle per
distringuere tra loro gli oggetti
protected Object clone()
Ritorna un clone dell'oggetto
public final Class getClass()
Ritorna un oggetto Class contenente la classe cui
appartiene l'oggetto
protected void finalize()
Viene invocato appena prima di una cancellazione quando
l'oggetto viene selezionato per la garbage collection
Questi metodi possono essere overridati (ove non final).
Linguaggio Java
Ing. Thimoty Barbieri
34/92
Uso di classi anonime
È possibile definire classi 'al volo', senza assegnare loro
esplicitamente un nome, ma usandole come 'oggetti passanti'
di ritorno. Queste classi sono dette anonime:
public DataSet createSet() {
return new DataSet() {
private int numrec = 0;
private String setname = "";
public String whichName() {
return setname;
}
}
Linguaggio Java
Ing. Thimoty Barbieri
35/92
Classi e meto di astratti
È possibile creare classi in cui alcuni metodi sono implementati,
altri invece non lo sono: questo perché la classe non è
sufficientemente specifica, e risulta meglio affidare
l'implementazione a sottoclassi di questa classe.
I metodi non implementati sono detti abstract. Una classe che
contiene un metodo abstract è essa stessa detta abstract.
Le classi che ereditano da una classe abstract devono
implementare il metodo astratto della superclasse.
abstract class Benchmark {
abstract void benchmark();
public long repeat(int count) { . . .}
}
class MethodBenchmark extends Benchmark {
void benchmark() { . . .}
}
Linguaggio Java
Ing. Thimoty Barbieri
36/92
Interfacce
Le interfacce sono un modo per dichiarare una struttura basata
solo su metodi astratti e relative costanti.
Essa è il risultato della pura progettazione, a prescindere
dall'effettiva implementazione Java.
Tipicamente è il risultato che il progettista passa al
programmatore, per assicurarsi che il programmatore realizzi il
modulo esattamente secondo le specifiche di progetto.
L'uso dell'interfaccia consente di aggirare il modello ad
ereditarietà singola, ottenendo di ereditare campi e metodi
anche da più di una classe.
Linguaggio Java
Ing. Thimoty Barbieri
37/92
Estensio ne attraverso le interfacce
Per evitare i problemi dati dall'ereditarietà a diamante
(conflitto tra identificatori con il medesimo nome), Java evita
formalmente l'uso di ereditarietà multipla.
Tuttavia il modello a ereditarietà singola impedisce di scrivere
codice molto utile (ad es. un Applet che sia anche un Thread
deve ereditare sia dalle classi Applet che dalla classe Thread!)
Ciascuna classe può dunque implementare un'interfaccia ed
estendere una classe.
A sua volta, ogni interfaccia può estendere una classe.
Se dunque una classe implementa un'interfaccia che estende
un'altra classe, ecco che la prima classe ha un risultato simile a
una doppia ereditarietà.
Linguaggio Java
Ing. Thimoty Barbieri
38/92
Esempio di Estensione co n Interfacce
W
Y
X
Z
Questa struttura crea in Java un'ereditarietà a diamante:
interface W { }
interface X extends W { }
class Y implements W { }
class Z extends Y implements X { }
Linguaggio Java
Ing. Thimoty Barbieri
39/92
Riso luzio ne di C onflitti
Come dunque si risolvono i conflitti in un'ereditarietà a
diamante ottenuta in questo modo?
Se i metodi in X e Y hanno stesso nome ma segnature
diverse, Z avrà entrambi i metodi in overload
Se i metodi in X e Y hanno stesso nome e stesse
segnature, con pari valore ritornato, Z ha un unico metodo
con quella segnatura.
Se nome e segnature sono identiche e il tipo ritornato è
diverso, non è possibile che Z estenda/implementi sia X che
Y.
Se i metodi in X e Y differiscono solo per il tipo di eccezione
che lanciano, occorre fare in modo che le eccezioni lanciate
siano le stesse sia per X che per Y
Per gli identificatori si disambigua usando il full qualified
name: X.identif e Y.identif.
Linguaggio Java
Ing. Thimoty Barbieri
40/92
Gestione delle Eccezioni
Le eccezioni costituiscono un comodo meccanismo per
individuare il sorgere di errori a run-time e specificare il modo
con cui essi devono essere trattati, senza fermare l'esecuzione.
L'insorgere di un errore è detto eccezione.
È possibile 'avvisare' il codice di 'stare in guardia' per il
verificarsi di una certa eccezione. Se questo accade, il codice
lancia l'eccezione.
L'eccezione deve venire catturata da una porzione di codice
apposito, che si comporta in modo da correggere la situazione
che ha portato al lancio dell'eccezione.
Questo sistema consente di scrivere codice più nitido, che non
interrompe continuamente il flusso naturale di istruzioni di un
algoritmo.
Linguaggio Java
Ing. Thimoty Barbieri
41/92
C reazione di Eccezio ni
Le eccezioni sono considerabili come oggetti.
Per definire un tipo di eccezione, occorre creare una classe che
estende dalla superclasse Exception. È possibile definire campi
e metodi dell'oggetto eccezione lanciato dal codice che ha
incontrato un errore.
public class NoSuchAttributeException extends
Exception {
public String attrName;
NoSuchAttributeException(String name) {
Super("No attribute found!");
attrName = name;
}
}
Linguaggio Java
Ing. Thimoty Barbieri
42/92
Lancio di Eccezioni
Quando si implementa un metodo, se esiste la possibilità che
esso lanci un'eccezione che non sia derivata da
RuntimeException o Error (che sono lanciate di default),
occorre dichiararlo esplicitamente nella segnatura del metodo
mediante la specifica throws.
Questo metodo deve specificare al suo interno quando
l'eccezione va lanciata, mediante il comando throw.
public void replaceValue(String name, Object
newValue) throws NoSuchAttributeException {
Attr attr = find (name);
if (attr == null)
throw new
NoSuchAttributeException(name);
attr.setValue(newValue);
}
Linguaggio Java
Ing. Thimoty Barbieri
43/92
try, catch e finally
La struttura di controllo e raccolta di eccezioni è la seguente:
try {
codice che potrebbe lanciare un'eccezione
} catch (tipodieccezione ident1) {
codice che gestisce quel tipo di eccezione
} catch (tipodieccezione ident2) {
codice che gestisce un altro tipo di eccezione
} finally {
codice finale che viene eseguito in ogni caso
}
L'utilizzo di certi metodi richiedono obbligatoriamente che
vengano incapsulati dentro una try/catch (I/O, etc…)
Linguaggio Java
Ing. Thimoty Barbieri
44/92
La classe String
Le stringhe sono di grande utilizzo, ed in Java sono
rappresentate mediante una classe a parte, dotata di diversi
costruttori e di vari metodi di grande utilità.
È possibile anche usare una sorta di "aritmetica" di stringhe
usando gli operatori + e += overloadati sulla classe stringa.
Alcuni tra i metodi più utili:
indexOf(char ch)
indexOf(char ch, int start)
indexOf(String str)
indexOf(String str, int start)
lastIndexOf(…) (con le 4 medesime segnature)
equals(String str)
equalsIgnoreCase(String str)
length()
startsWith(String prefix) / endsWith(String suffix) . . .
Linguaggio Java
Ing. Thimoty Barbieri
45/92
Co nversioni da altri tipi a Stringa
Spesso è necessario convertire una Stringa in un altro o
viceversa per il trattamento dell'informazione:
Da un Tipo al Tipo Stringa:
boolean: String.valueOf(boolean)
byte:
String.valueOf(int)
short:
String.valueOf(int)
int:
String.valueOf(int)
long:
String.valueOf(long)
float:
String.valueOf(float)
double: String.valueOf(double)
Morale: si usa sempre il metodo valueOf (molto overloadato)
della classe Stringa.
Linguaggio Java
Ing. Thimoty Barbieri
46/92
Co nversio ne da Stringa a altri tipi
Al contrario, occorre utilizzare i metodi di conversione messi a
disposizione dal tipo di destinazione.
Alcuni di questi metodi sono statici delle classi wrapper e di
facile invocazione. Per i metodi non statici si può utilizzare
un'istanza creata appositamente.
boolean:
new Boolean(String).booleanValue()
byte:
Byte.parseByte(String, int base)
short:
Short.parseShort(String, int base)
int:
Integer.parseInt(String, int base)
long:
Long.parseLong(String, int base)
float:
new Float(String).floatValue()
double:
new Double(String).doubleValue()
Se la base non è indicata, si intende la conversione di numeri
in base dieci.
Linguaggio Java
Ing. Thimoty Barbieri
47/92
Stringhe ed Array di char
Una stringa può essere rappresentata come un array di char.
Questo può facilitare l'implementazione di alcuni metodi.
Esistono metodi per ricavare l'array da una Stringa, e per
creare un oggetto String da un array:
Da Stringa ad array:
String from = "Una Stringa"
char[] arraydichars = from.toCharArray()
Il contrario:
int len = chars.length();
String nuovaStringadaArray = new String(chars,
0, len)
Linguaggio Java
Ing. Thimoty Barbieri
48/92
I Thread
Spesso nei programmi si segue una sola linea di esecuzione,
all'interno di un processo.
I sistemi multithreaded consentono di suddividere un processo
in più "parti" dette thread. Ciascun thread ospita una separata
linea di esecuzione, che evolve parallelamente alle altre.
Questo parallelismo (concorrenza) consente la condivisione di
dati in memoria: fornisce sia grande potenza e versatilità e
richiede cautela – possono crearsi situazioni di stallo
(deadlock) o di corsa critica (race conditions).
Linguaggio Java
Ing. Thimoty Barbieri
49/92
Creazio ne di Thread
Un thread si definisce con un'istanza della classe Thread:
Thread worker = new Thread()
Successivamente il thread si configura, impostandone ad es. la
priorità.
Invocando il suo metodo start() si verifica uno spawn del
nuovo thread, e ne comincia l'esecuzione.
Il codice eseguito è quello contenuto nel metodo run().
Quando si esce dal metodo run(), il thread viene terminato.
Linguaggio Java
Ing. Thimoty Barbieri
50/92
Creazio ne di Thread
Di default run() ha un'implementazione vuota, quindi occorre
definire in generale una classe che eredita da Thread e che fa
un override quantomeno di run() perché il Thread faccia
qualcosa di interessante.
I metodi stop, interrupt, suspend, consentono di controllare
l'esecuzione del thread (arrestarlo, interromperlo,
sospenderlo).
Il metodo stop solitamente non è sufficiente.
È buona norma porre a null l'identificatore che ospita il thread
per farlo uccidere il prima possibile dal Garbage Collector.
Il metodo sleep consente di inserire dei cicli d'attesa per
privilegiare un Thread rispetto ad un altro.
Linguaggio Java
Ing. Thimoty Barbieri
51/92
Un Esem pio di Thread
public class PingPong extends Thread {
private String word;
private int delay;
public PingPong(String whatToSay, int
delay) {
word = whatToSay;
this.delay = delay;
}
public void run () {
try {
for (;;) {
System.out.print(word);
Sleep(delay);
}
} catch (InterruptedException e) {
return;
}
}
Linguaggio Java
Ing. Thimoty Barbieri
52/92
Esem pio (continua)
public static void main(String[] args)
{
// Lancia i due thread e dimostra
// che si eseguono in parallelo
new PingPong("ping", 33).start();
new PingPong("PONG", 100).start();
}
}
Linguaggio Java
Ing. Thimoty Barbieri
53/92
Sincro nizzazione
In programmazione concorrente esiste la possibilità che due
thread tentino di modificare lo stato di un medesimo oggetto.
Questo potrebbe causare delle incosistenze.
Utilizzando dei metodi dichiarati sincronizzati, viene posto un
blocco (lock) su quell'oggetto, che viene riservato al detentore
del lock fino a che esso non lo rilascia esplicitamente.
In questo modo non è possibile che due thread utilizzino
concorrentemente un oggetto.
L'altro thread deve attendere che il primo rilasci il blocco.
Il blocco si considera per thread. Se un thread che detiene già
un blocco deve utilizzare un altro metodo sincronizzato
sull'oggetto, può farlo perché detiene il lock.
Linguaggio Java
Ing. Thimoty Barbieri
54/92
Esempio di Sincronizzazio ne
Ad esempio due thread che si occupano di aggiornare due
scritture contabili devono prevedere che il metodo di lettura e
quello di scrittura siano sincronizzati per garantire l'esattezza
degli stati.
class Account {
private double balance;
public Account(double initialDeposit) {
balance = initialDeposit;
}
public synchronized double getBalance() {
return balance;
}
public synchronized void deposit(double
amount) {
balance += amount;
}
}
Linguaggio Java
Ing. Thimoty Barbieri
55/92
Lo ck su codice
È possibile all'interno di metodi non esplicitamente sincronizzati
richiede un lock su un oggetto e eseguirvi delle operazioni con
la garanzia che nel frattempo nessun altro thread modifichi
l'oggetto.
È sufficiente usare synchronized specificando l'identificatore
dell'oggetto da lockare, seguito dal blocco di codice da
eseguire durante il lock:
public static void abs(int[] values) {
synchronized (values) { //locka l'array per
// modificarlo
for(int i=0;i<values.length;i++) {
if (values[i]<0) values[i] = values[i];
}
} // chiude il blocco su cui acquisire il
// lock
}
Linguaggio Java
Ing. Thimoty Barbieri
56/92
wait
È possibile coordinare tra loro i Thread usando delle condizioni
di attesa e di sblocco a comune.
wait mette in attesa un thread fino a che la condizione di
attesa non viene soddisfatta.
Quando questo accade, altri thread utilizzano notify o notifyAll
per comunicare al thread in attesa di proseguire.
synchronized void doWhenCondition() {
while (!condition) wait();
. . . codice da eseguire a condizione
avverata . . .
}
Linguaggio Java
Ing. Thimoty Barbieri
57/92
Co ndizioni di uso di wait
Il blocco di sospensione per wait deve essere sincronizzato:
altrimenti lo stato dell'oggetto non è garantito stabile e
qualche altro oggetto potrebbe alterare la condizione di attesa
creando effetti non voluti.
wait ha l'effetto di sospendere il thread e nello stesso tempo
(atomicamente) di rilasciare il blocco del synchronize. Questo
consente agli altri oggetti di modificare la condizione di
sospensione, ma senza creare una corsa critica.
(Essa si verificherebbe se si riceve una notifica dopo il rilascio
del blocco ma prima della sospensione del thread se non
eseguite atomicamente: la notifica non avrebbe effetto sul
thread che sarebbe comunque sospeso).
La condizione va sempre in un loop: infatti il thread potrebbe
ricevere una notifica per una condizione che non gli compete,
ed in questo caso deve ciclare e ripetere lo stato di
sospensione.
Linguaggio Java
Ing. Thimoty Barbieri
58/92
notify e notifyA ll
Costituiscono la controparte del thread in attesa col wait.
Notify notifica un solo thread (scelto random), notifyAll notifica
tutti i thread in wait, che verificano la condizione.
Se la condizione è soddisfatta, escono dal wait (incapsulato in
una while condizionata). Quasi sempre si usa la notifyAll.
synchronized void changeCondition() {
. . . cambia i valori della condizione . .
.
notifyAll();
}
Per gli stessi motivi della wait, occorre acquisire un lock per
modificare lo stato della condizione in modo stabile.
Linguaggio Java
Ing. Thimoty Barbieri
59/92
Schedulazio ne
Esiste una 'preferenza' nella scelta dei thread che sono fatti
girare con un maggior tempo macchina.
Questa scelta si riflette nella priorità: thread con maggiore
priorità sono eseguiti con un maggior tempo macchina rispetto
a quelli a bassa priorità.
Conviene tenere a bassa priorità thread che devono rimanere
continuamente in esecuzione: in caso contrario essi
utilizzerebbero troppe risorse.
Questo impedirebbe a thread che devono attivarsi ogni tanto
per dare risposte pronte di funzionare (esempio la raccolta di
input dall'utente).
Linguaggio Java
Ing. Thimoty Barbieri
60/92
Priorità
setPriority consente di impostare una priorietà a
MIN_PRIORITY, MAX_PRIORITY, NORM_PRIORITY.
Un thread inizialmente riceve la stessa priorità del thread che
l'ha generato.
getPriority restituisce la priorità di un thread.
Quando un thread viene interrotto, comincia l'esecuzione di un
altro thread con la stessa priorità.
Tutti i thread con la priorità massima verranno "prima o poi"
eseguiti.
I thread a priorità più basse vengono eseguiti quando gli altri
thread sono sospesi o bloccati perché stanno eseguendo un
metodo "bloccante".
Linguaggio Java
Ing. Thimoty Barbieri
61/92
sleep e yield
Mediante sleep(long millis) è possibile impostare una
sospensione del numero di millisecondi (circa) specificato, in
modo da consentire ad altri thread di assumere la priorità.
Mediante yield() si cede l'esecuzione prioritaria ad altri thread
che possono essere messi in esecuzione. Lo schedulatore di
thread sceglie uno dei thread.
Non esiste un ordine garantito di esecuzione dei thread, la cui
gestione è diversa a seconda della configurazione della
macchine e del sistema operativo usato.
L'unica assunzione è che "prima o poi" tutti i thread hanno
occasione di essere eseguiti.
Linguaggio Java
Ing. Thimoty Barbieri
62/92
Co ndizione di Deadlock
Ogniqualvolta si hanno almeno due thread e due lock
incrociati, può formarsi una situazione di stallo (deadlock), in
cui ciascun thread aspetta che l'altro rilasci il lock per
proseguire.
In questo 'abbraccio mortale' l'esecuzione non si trova più in
condizione di proseguire.
Il programmatore è responsabile di non creare oggetti e
situazioni di lock che formino situazioni di stallo.
Linguaggio Java
Ing. Thimoty Barbieri
63/92
Terminazio ne di un Thread
In generale la vita di un thread termina quando l'esecuzione
esce dal metodo run().
Questo è il metodo più pulito, coadiuvato da un'esplicita
riassegnazione del Thread a null.
Esistono tuttavia altri modi di terminare un thread:
usando il metodo interrupt() si manda un segnale di
interruzione ad un thread.
Questo segnale può essere raccolto con il metodo
isInterrupted() ed usato per fermare il thread, ad esempio
incapsulando il run() in questo modo:
while (!isInterrupted()) { . . . }
Linguaggio Java
Ing. Thimoty Barbieri
64/92
Attesa di terminazione di thread
È possibile attendere la fine di un thread con il metodo join().
La sua invocazione dopo il lancio di un thread arresta il
chiamante fino a che il thread di riferimento non termina.
Se il thread di riferimento termina prima che il chiamante usi la
join(), join ritorna immediatamente.
In questo modo è possibile creare una forma di coordinamento
tra chiamante e thread eseguiti.
Linguaggio Java
Ing. Thimoty Barbieri
65/92
Esempio di Join
class ShowJoin {
public static void main(String args[]) {
CalcThread calc = new CalcThread();
calc.start();
doSomethingElse();
try {
calc.join();
System.out.println("calc
terminato");
} catch (InterruptedException e) {
System.out.println("interrupted.");
}
}
Linguaggio Java
Ing. Thimoty Barbieri
66/92
Runnable
In situazioni in cui la parola extends è preziosa per estendere
da qualche altra classe, ma serve comunque creare un Thread,
si implementa da Runnable.
L'oggetto Runnable viene passato al costruttore di Thread
apposito per creare un Thread.
class RunPingPong implements Runnable {
. . .
public static void main(String args[]) {
Runnable ping = new RunPingPong("ping",33);
Runnable pong = new RunPingPong("PONG",
100);
// chiama il costruttore Thread che riceve
Runnable
new Thread(ping).start();
new Thread(pong).start();
} }
Linguaggio Java
Ing. Thimoty Barbieri
67/92
I Package
Progetti Java complessi possono avere un elevato numero di
classi.
Può essere necessario organizzare queste classi in gruppo detti
package.
Essi possono essere strutturati ad albero: questa struttura si
riflette nel file system mediante l'albera della directory in cui
sono disposte le classi.
Il package va dichiarato in testa ad ogni sorgente
appartenente al package usando l'istruzione package <nome
package>.
Linguaggio Java
Ing. Thimoty Barbieri
68/92
Package - Esempio
Ad esempio dodici classi che fanno parte del package test
andranno salvate nella directory test.
L'esecuzione della classe principale (ad es. runme.class) va
effettuata fuori dalla directory test in questo modo:
?? java test.runme
Ciascun sorgente .java deve iniziare come prima linea in
questo modo:
package test;
I package possono essere importati da altre classi fuori dal
package mediante la clausola import.
I package sono di riferimento per lo scoping dei modificatori.
Linguaggio Java
Ing. Thimoty Barbieri
69/92
Uso di JavaDo c
La documentazione ed i commenti all'interno del codice sono
un dovere preciso del programmatore.
JavaDoc è un utility del JDK che consente di generare delle
pagine html di riferimento in stile Documentazione API da
utilizzare per la consultazione.
È sufficiente digitare
?? javadoc <nome sorgente java>
Per generare gli html di riferimento corrispondenti al codice.
Linguaggio Java
Ing. Thimoty Barbieri
70/92
Co mmenti per JavaD oc
Sono parsati da JavaDoc tutti i commenti che iniziano con /**
e terminano con */.
Questi commenti devono essere posti prima della segnatura
del metodo cui si riferiscono o della classe o identificatore cui
si riferiscono.
All'interno dei commenti è possibile inserire tag HTML che
verranno interpretati dal browser quando si consultano le
pagine generate
Possono essere inoltre usati dei tag speciali (preceduti da @)
allo scopo di inserire informazioni dinamiche aggiuntive.
Linguaggio Java
Ing. Thimoty Barbieri
71/92
Tag per JavaDoc
@see
riferimento ad altro link
@param
parametri di ingresso del metodo
@return
parametro di uscita del metodo
@exception
eccezioni lanciate dal metodo
@deprecated
marca il metodo come deprecato
@author
indica l'autore del metodo/classe
@version
indica la versione della classe
@since
specifica la versione di prima apparizione
Linguaggio Java
Ing. Thimoty Barbieri
72/92
Esem pio di JavaDo c
/**
* Questo metodo serve come esempio
* <H1> È un metodo molto bello!</H1>
* @author dott. Mario Rossi
* @since 1.0
* @version 1.1
*/
public void TestMethod() {
...
}
Nella pagina html apparirà una voce TestMethod con
l'opportuno commento e le specifiche indicate.
Linguaggio Java
Ing. Thimoty Barbieri
73/92
Utilità
Le API Java forniscono alcuni classi interessanti di grande
utilità nella programmazione, raccolte nella libreria java.util.*.
Fra queste:
Enumeration
Vector
Hashtable
Date
Random
StringTokenizer
Linguaggio Java
Ing. Thimoty Barbieri
74/92
Enumeration
Enumeration è un'interfaccia che consente di gestire scansioni
lineari lungo liste di valori.
Mette a disposizione due metodi:
boolean hasMoreElements()
ritorna true se la lista ha altri elementi da scandire
Object nextElement()
Ritorna l'elemento successivo nella lista.
Utilizzo tipico:
Hashtable table;
Enumeration e = table.elements();
while (e.hasMoreElements())
doSomethingWith(e.nextElement());
Linguaggio Java
Ing. Thimoty Barbieri
75/92
Vecto r
La classe Vector consiste un metodo comodo di impostare
array di oggetti in modo dinamico, molto meglio con gli array
normali.
addElement(Object obj)
aggiunge l'oggetto come ultimo elemento del vettore
insertElementAt(Object obj, int index)
aggiunge l'oggetto alla posizione index
setElementAt(Object obj, int index)
imposta l'oggetto alla posizione index
removeElementAt(int index)
rimuove l'elemento alla posizione index
removeAllElements()
svuota l'array
elementAt(int index)
ritorna l'elemento alla posizione index
isEmpty() . . . etc. etc.
Linguaggio Java
Ing. Thimoty Barbieri
76/92
Dictionary
Dictionary è un interfaccia che implementa una matrice a
doppia entrata, con una colonna per le chiavi di ricerca ed una
per i contenuti.
Essa viene implementata dalla classe Hashtable.
I metodi previsti da Dictionary sono:
Object put(Object key, Object element)
Inserisce in dizionario una coppia chiave di ricerca –
elemento
Object get(Object key)
Ritorna l'oggetto legato alla chiave chiesta
Object remove(Object key)
Rimuove l'oggetto legato alla chiave
Enumeration keys()
Ritorna l'enumerazione delle chiavi presenti in dizionario
Enumeration elements()
Ritorna l'enumerazione degli elementi in dizionario
Linguaggio Java
Ing. Thimoty Barbieri
77/92
Hashtable
Hashtable implementa effettivamente l'interfaccia Dictionary
aggiungendo altri utili metodi:
boolean containsKey(Object key)
vero se la chiave richiesta esiste
boolean contains(Object element)
vero se l'elemento richiesto esiste
void clear()
svuota l'hashtable
Linguaggio Java
Ing. Thimoty Barbieri
78/92
Rando m
Consente di generare numeri casuale a partire da un seme.
Random() o Random(seed) costruisce l'oggetto per generare i
numeri casuali.
nextInt / nextLong / nextDouble … generano un numero
casuale del tipo richiesto.
Linguaggio Java
Ing. Thimoty Barbieri
79/92
StringTokenizer
Una classe utilissima che consente di separare una stringa in
parti (token) dato un separatore a richiesta. Ottimo per
"parsare" linee di comando.
StringTokenizer(String str, String delim)
Crea un tokenizer sulla stringa richiesta considerando il
delimitatore considerato.
boolean hasMoreTokens()
ritorna true se ci sono altri token nella stringa
String nextToken()
ritorna il token successivo nella stringa
int countToken()
conta i token presenti nella stringa.
Linguaggio Java
Ing. Thimoty Barbieri
80/92
I/O e Netw orking
Le classi di I/O utilizzano il concetto di stream, o flusso di dati.
Sono a disposizione stream di output e stream di input, basato
su byte oppure basato su caratteri.
Esistono numerose varianti degli stream per la scrittura e
lettura, occorre scegliere la più adatta al tipo di dati che si sta
trattando.
Nei Character Stream le due classi astratte principali sono
Reader e Writer (per leggere e scrivere).
È possibile legare uno stream ad un file su disco mediante
l'uso della classe per lo stream di tipo File.
RandomAccessFile è la classe più conviente per gestire i File,
ma perdendo la possibilità di gestione a livello di caratteri.
Linguaggio Java
Ing. Thimoty Barbieri
81/92
Metodi Standard
Reader:
read()
legge un carattere
read(char[])
legge un buffer di caratteri
Writer:
write(int c)
scrive un carattere
write(String str)
scrive una stringa
flush()
forza lo stream in uscita in scrittura
Linguaggio Java
Ing. Thimoty Barbieri
82/92
Uso di Stream File (Byte o riented)
import java.lang.*;
import java.io.*;
public class FilIOApp {
public static void main(String args[])
throws IOException {
FileOutputStream outStream = new
FileOutputStream("Test.txt");
String s = "This is a test!";
for(int i=0;i<s.length();++i)
outStream.write(s.charAt(i));
outStream.close()
// Ora riapre il file per la lettura
FileInputStream inStream = new
FileInputStream("Test.txt");
int inBytes = inStream.available();
byte inBuf[] = new byte[inBytes];
int bytesRead= inStream.read(inBuf,0,inBytes);
System.out.println(new String(inBuf));
inStream.close();
File f=new File("Test.txt");
f.delete(); } }
Linguaggio Java
Ing. Thimoty Barbieri
83/92
Rando mAccessFile
private void fileIssue(String fileName) {
try {
RandomAccessFile file = new
RandomAccessFile(fileName, "r");
long filePointer = 0;
long length = file.length();
while (filePointer < length)
{
String s = file.readLine()+"\n\r";
out.writeChars(s);
filePointer = file.getFilePointer();
}
} catch (Exception e) {
System.err.println(e.toString());
}
}
Linguaggio Java
Ing. Thimoty Barbieri
84/92
Networking
La libreria java.net.* consente di creare dei Socket TCP ed
UDP per la trasmissione di datagrammi e la ricezione di essi.
Le classi principali sono:
Socket: crea un Socket TCP client
ServerSocket: crea un Socket TCP server in ascolto
InetAddress: gestisce gli indirizzi IP
DatagramPacket: consente la gestione di datagrammi per
l'invio/ricezione di pacchetti UDP.
Linguaggio Java
Ing. Thimoty Barbieri
85/92
C reazione di un So cket di Trasmissione
// Attacca il socket
try {
s = new Socket(host, port);
String myAddressAndPort =
s.getInetAddress() + ":"+ s.getPort();
System.err.println("Connected to server
at " + myAddressAndPort);
}
catch (IOException e) {
System.err.println("Couldn't make
socket: "+ e);
}
Linguaggio Java
Ing. Thimoty Barbieri
86/92
Scrittura su So cket Client
try {
sout = new
PrintWriter(socket.getOutputStream());
System.err.println("Typist thread
opened output stream to server");
}
catch (IOException e) {
System.err.println ("Typist thread
can't open output stream to server");
parent.errorString1 = "Cannot
initialize connection.";
parent.errorString2 = "Threads
stopped.";
return;
}
Linguaggio Java
Ing. Thimoty Barbieri
87/92
Scrittura su So cket C lient (2 )
//Creo la stringa contenente l'IP e la
porta locale per il callback
byte[] addr =
socket.getLocalAddress().getAddress();
IpPort =
(addr[0]&0xff)+"."+(addr[1]&0xff)+"."+(addr[2]
&0xff)+"."+(addr[3]&0xff);
IpPort = IpPort+ ":" +
socket.getLocalPort() + " ";
parent.moto.advise(this, IpPort);
}
//Spedisce un evento
public void sendEvent(String lineEvent) {
lineEvent = lineEvent.trim() + "\n";
sout.print(lineEvent);
sout.flush();
}
Linguaggio Java
Ing. Thimoty Barbieri
88/92
Uso di Socket Server
// Apre il socket di ascolto TCP
try {
listen_socket = new ServerSocket(port); }
catch (IOException e) {
fail(e, "Exception creating server socket");}
// Fai partire il thread di ascolto sul socket
TCP
this.start(); }
public void run() {
try {
while(true) {
Socket client_socket =listen_socket.accept();
Connection c = new Connection(client_socket,
this); }
} catch (IOException e) {
fail(e, "Exception while listening for
connections"); }
}
Linguaggio Java
Ing. Thimoty Barbieri
89/92
Apertura Stream per Socket
try {
in = new
DataInputStream(client.getInputStream());
out = new
DataOutputStream(client.getOutputStream());
}
catch (IOException e) {
try {
client.close();
log("Successfully closed
client socket");
}
catch (IOException e2) {
}
logException(e, "Exception while
getting socket streams");
return;
}
Linguaggio Java
Ing. Thimoty Barbieri
90/92
Lettura e Stampa su Stream dei So cket
// legge un carattere e ne fa l'echo
// sul terminale remoto
line="";
charIn= 0;
sb = new StringBuffer("");
while (charIn != 10) {
charIn= in.read();
out.writeChar(charIn);
sb.append((char) charIn);
}
out.flush();
line = sb.toString();
line = line.substring(0,line.length()-2);
Linguaggio Java
Ing. Thimoty Barbieri
91/92
Package Standard
Java è dotato di un numero elevato ed in continua crescita di
package standard e di API di supporto.
Tra le più importanti:
java.awt
consente di costruire interfacce grafiche/visuali (Bottoni,
finestre, ecc.)
java.swing
Miglioramenti alla GUI con elementi di interfaccia avanzati
JDBC
Strato di accesso via SQL a qualsiasi DBMS
Linguaggio Java
Ing. Thimoty Barbieri
92/92