PROGRAMMAZIONE AVANZATA JAVA E C

PROGRAMMAZIONE
AVANZATA JAVA E C
Massimiliano Redolfi
Lezione 1: warm-up
Premessa
[email protected]
ricevimento: martedì dalle 11.30 alle 12.30
mandate mail con oggetto [pajc cognome nome] descrizione
Ricordate che le informazioni utili verranno date a
tempo utile…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Prerequisiti, argomenti, libri e altro….
Il corso di Fondamenti è un prerequisito… daremo per scontate e quindi note:
• le conoscenze base Java (perlomeno tipi dati, costrutti, classi, gestione errori)
• le conoscenze base relativi ad algoritmi e pattern fondamentali
• le conoscenze base realtive ai sistemi operativi (ls, df, du, top, …) !
• saper utilizzare un calcolatore
• saper utilizzare eclipse
Tanto per non sbagliarci e dare troppo per scontato faremo comunque qualche
ripasso-test al momento opportuno.
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Prerequisiti, argomenti, libri e altro….
Libri di testo:
Thinking in Java, Bruce Eckel, Prentice Hall
Core Java 2 Volume I e II Pearson, Cay S. Horstmann,
Gary Cornell - Prentice Hall
Il linguaggio C – seconda edizione, Brian W. Kernighan,
Dennis M. Ritchie Pearson – Prentice Hall
Qualche url…
Oppure libri equivalenti che avete. Scegliete testi in inglese,
sono più aggiornati più chiari e contengono meno errori.
sito del corso (disponibile dal 22/9…)
http://apollo.ing.unibs.it/pajc
PS: esiste anche una nuova risorsa, Internet… provare ad
utilizzarla non è male, e non è un consiglio!
PS2: durante lo svolgimento del corso avremo modo di
analizzare altre risorse… a tempo debito…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Prerequisiti, argomenti, libri e altro….
Le slide sono INDICI (parziali) di ciò che DOVETE sapere
Le slide:
• non sostituiscono i libri
• non sostituiscono gli appunti
• non sono fatte per “studiarci sopra”
• non sono esaustive
• non sono complete
• vengono distribuite dopo le lezioni
Per tutto quanto sopra a voi le slide NON servono! Voi state frequentando il corso,
potete prendere appunti che saranno certamente più completi!
Le slide dovrebbero servire solo a chi non frequenta il corso per sapere (più o
meno) ciò che si è perso.
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Orario
ORARIO UFFICIALE
MARTEDÌ dalle 8.30 alle 11.30
VENERDÌ dalle 8.30 alle 12.30
ORARIO EFFETTIVO
MARTEDÌ
VENERDÌ
dalle 8.45 alle 11.15++ (pausa alle 10.00 circa)
dalle 8.45 alle 12.00++ (pausa alle 10.30 circa)
aule
MARTEDÌ — MLAB1
VENERDÌ — N9
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
I perché del corso… ossia cosa dovreste sapere alla fine
JAVA:
•OOP
•programmazione event driven
•programmazione concorrente
•GUI / grafica
•web service, XML, XSD
•applicazioni web (applet)
•mobile (Android)
C:
•programmazione procedurale
•connessione stretta tra programma e hardware
•comprensione profonda di come funziona un calcolatore
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
I perché del corso… last but not least
•comprendere un problema
•saper risolvere un problema
•saper definire algoritmi efficienti ed efficaci per risolvere problemi
•imparare a progettare algoritmi che generano algoritmi che risolvono
problemi
•saper provare
(*) per problema si intende un problema di natura informatica, altri esulano
dagli obiettivi del corso (almeno da quelli principali)
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Modalità d’esame
Prova scritta
- domande a risposta multipla
- domande aperte
- esercizi Java / C
Orale:
- se il voto della prova scritta è al limite della sufficienza
- oppure se si vuole migliorare il proprio voto (attenzione si
può anche peggiorarlo od essere bocciati)
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Ricetta per superare l’esame
seguire le lezioni
seguire tutte le lezioni (o almeno la maggior parte)
capire le lezioni
studiare sugli appunti, sui libri e sul proprio PC (slide solo come indice)
eseguire i compiti assegnati
provare a realizzare propri progetti ed a verificarne il funzionamento
porsi domande ed approfondire oltre i compiti assegnati e gli argomenti visti
iscriversi e partecipare all’esame e rispondere correttamente (senza copiare)
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
WARMUP
Ok! Let’s go!
Riprendiamoci dalle ferie…
…rispolveriamo un po di Java e iniziamo a dare un occhio al C
Siamo capitati nel nel bimondo dove
tutto è a due dimensioni… abbiamo un
problema… aiutare gli abitanti a
classificare i loro oggetti…
Prima di tutto salutiamo…
Java vs C: Hello World
HelloWorld.java
package it.unibs.eps;
public class HelloWorld {
public static void main(String[] args) {
System.out.printf("Hello World from JAVA!");
}
}
main.c
#include <stdio.h>
int main(void) {
printf("Hello World from C");
return 0;
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
primo tempo
Iniziamo con i Rettangoli…
Java vs C: Rectangle
package it.unibs.eps;
Main.java
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
public static int area(Rectangle r)
…
public static void main(String[] args) {
Rectangle r = new Rectangle();
r.height = 5;
r.width = 7;
System.out.printf(“Per.: %d\n", perimeter(r));
System.out.printf("Area: %d\n", area(r));
System.out.printf("Area: %s\n", r);
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
package it.unibs.eps;
public class Rectangle {
public int height;
public int width;
}
Rectangle.java
Java vs C: Rectangle
#include <stdio.h>
main.c
typedef struct Rectangle_ST {
int width;
int height;
} Rectangle_T;
package it.unibs.eps;
Rectangle.java
public class Rectangle {
public int height;
public int width;
}
int perimeter(Rectangle_T r)
{
return (r.width + r.height) * 2;
}
package it.unibs.eps;
Main.java
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
int area(Rectangle_T r)
{
return r.width * r.height;
}
public static int area(Rectangle r)
…
public static void main(String[] args) {
int main(void) {
Rectangle_T r;
r.height = 5;
r.width = 8;
Rectangle r = new Rectangle();
r.height = 5;
r.width = 7;
printf("Perimetro rettangolo: %d\n", perimeter(r));
printf("Area rettangolo: %d\n", area(r));
System.out.printf(“Per.: %d\n", perimeter(r));
System.out.printf("Area: %d\n", area(r));
System.out.printf("Area: %s\n", r);
return 0;
}
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: l’operatore new e la costruzione di oggetti…
Main.java
package it.unibs.eps;
package it.unibs.eps;
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
public class Rectangle {
public int height;
public int width;
}
Rectangle.java
public static int area(Rectangle r)
…
public static void main(String[] args) {
Rectangle r = new Rectangle();
r.height = 5;
r.width = 7;
System.out.printf(“Per.: %d\n", perimeter(r));
System.out.printf("Area: %d\n", area(r));
System.out.printf("Area: %s\n", r);
}
}
Operatore: new
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
L’operatore new crea un’istanza della classe
Rectangle, un oggetto di tipo Rectangle, che
viene assegnato alla variabile r.
Java: l’operatore new e la costruzione di oggetti…
Main.java
Rectangle.java
package it.unibs.eps;
package it.unibs.eps;
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
public class Rectangle {
public int height;
public int width;
Dov’è il metodo Rectangle()?? è un costruttore
}
implicito automaticamente definito per ogni classe
public static int area(Rectangle r)
…
public static void main(String[] args) {
Costruttore implicito
Rectangle r = new Rectangle();
r.height = 5;
r.width = 7;
System.out.printf(“Per.: %d\n", perimeter(r));
System.out.printf("Area: %d\n", area(r));
System.out.printf("Area: %s\n", r);
}
}
Il costruttore di una classe è una particolare
funzione che viene richiamata al momento della
creazione dell’istanza della classe ottenuta tramite
l’operatore new ed ha lo scopo di inizializzare
l’oggetto creato.
Un costruttore ha lo stesso nome della classe e
non restituisce alcun valore, può essere implicito
(quello di default) o esplicito.
Operatore: new
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: esplicitiamo il costruttore e passiamo larghezza ed altezza…
Main.java
Rectangle.java
package it.unibs.eps;
package it.unibs.eps;
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public static int area(Rectangle r)
…
}
public static void main(String[] args) {
Rectangle r = new Rectangle(5, 7);
System.out.printf(“Per.: %d\n", perimeter(r));
System.out.printf("Area: %d\n", area(r));
System.out.printf("Area: %s\n", r);
}
}
Operatore: new
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
this, l’oggetto corrente, l’oggetto
che invoca il metodo
Costruttore esplicito
L002
secondo tempo
Aggiungiamo i quadrati…
Java vs C: … aggiungiamo un quadrato
main.c
#include <stdio.h>
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
typedef struct Rectangle_ST…
int perimeter(Rectangle_T r)…
int area(Rectangle_T r)…
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
typedef struct Square_ST {
int width;
int height;
} Square_T;
}
int perimeter_sq(Square_T r){
return (r.width + r.height) * 2;
}
package it.unibs.eps;
int area_sq(Square_T r){
return r.width * r.height;
}
int main(void) {
Rectangle_T r;
Square_T s;
r.height = 5;
Rectangle.java
Square.java
public class Square {
public int width;
public int height;
r.width = 8;
public Square(int size) {
this.width = size;
this.height = size;
}
s.height = s.width = 9;
printf("Perimetro rettangolo: %d\n", perimeter(r));
printf("Area rettangolo: %d\n", area(r));
}
printf("Perimetro quad.: %d\n", perimeter_sq(s));
printf("Area quadrato: %d\n", area_sq(s));
return 0;
}
Main.java
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java vs C: calcolare perimetro e area… polimorfismo
main.c
#include <stdio.h>
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
typedef struct Square_ST {
int width;
int height;
} Square_T;
public static int area(Rectangle r) {
return r.height * r.width;
}
int perimeter_sq(Square_T r){
return (r.width + r.height) * 2;
}
public static int perimeter(Square r) {
return (r.height + r.width) * 2;
}
int area_sq(Square_T r){
return r.width * r.height;
}
Square_T s;
r.height = 5;
Rectangle.java
Main.java
package it.unibs.eps;
typedef struct Rectangle_ST…
int perimeter(Rectangle_T r)…
int area(Rectangle_T r)…
int main(void) {
Rectangle_T r;
Square.java
public static int area(Square r) {
return r.height * r.width;
}
r.width = 8;
public static void main(String[] args) {
s.height = s.width = 9;
Rectangle r = new Rectangle(5, 7);
Square s = new Square(9);
printf("Perimetro rettangolo: %d\n", perimeter(r));
printf("Area rettangolo: %d\n", area(r));
System.out.printf(“P.R.: %d\n", perimeter(r));
System.out.printf(“A.R.: %d\n", area(r));
printf("Perimetro quad.: %d\n", perimeter_sq(s));
printf("Area quadrato: %d\n", area_sq(s));
System.out.printf(“P.Q.: %d\n", perimeter(s));
System.out.printf(“A.Q.: %d\n", area(s));
return 0;
}
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java vs C: calcolare perimetro e area… polimorfismo
package it.unibs.eps;
Main.java
public class Main {
public static int perimeter(Rectangle r) {
return (r.height + r.width) * 2;
}
public static int area(Rectangle r) {
return r.height * r.width;
}
public static int perimeter(Square r) {
return (r.height + r.width) * 2;
}
public static int area(Square r) {
return r.height * r.width;
}
public static void main(String[] args) {
Rectangle r = new Rectangle(5, 7);
Square s = new Square(9);
System.out.printf(“P.R.: %d\n", perimeter(r));
System.out.printf(“A.R.: %d\n", area(r));
System.out.printf(“P.Q.: %d\n", perimeter(s));
System.out.printf(“A.Q.: %d\n", area(s));
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Square.java
Rectangle.java
Polimorfismo: funzioni diverse possono avere lo
stesso nome purché abbiano parametri diversi (come
tipo o numero…)
Il sistema sceglie quella da invocare in funzione del
tipo di dato utilizzato/passato.
Siamo in presenza di quello che viene anche definito
overloading di metodi.
Derivazioni sul tema rettangolare
Java: ma un quadrato non è…
Square
Rectangle
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
Rectangle.java
package it.unibs.eps;
public class Square {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Square.java
public Square(int size) {
this.width = size;
this.height = size;
}
}
L003
Java: un quadrato deriva da un rettangolo…
Square
Rectangle
package it.unibs.eps;
Rectangle.java
public class Rectangle {
public int width;
public int height;
Square.java
package it.unibs.eps;
public class Square extends Rectangle {
public Square(int size) {
this.width = size;
this.height = size;
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: un quadrato deriva da un rettangolo…
SUBCLASS
Classe DERIVATA / FIGLIA
SUPERCLASS
Classe PADRE
Square
Rectangle
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Rectangle.java
package it.unibs.eps;
public class Square extends Rectangle {
public Square(int size) {
this.width = size;
this.height = size;
}
}
Square.java
Java: super, this e la construction chain
SUBCLASS
Classe DERIVATA / FIGLIA
SUPERCLASS
Classe PADRE
Square
Rectangle
this è.. Rectangle
super è ???
this è.. this… cioè Square
super è Rectangle
Rectangle.java
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
Square.java
package it.unibs.eps;
public class Square extends Rectangle {
public Square(int size)
super(size, size);
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
{
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: sopra tutto c’è Object
Se non diversamente specificato un oggetto viene
derivato automaticamente dall’oggetto Java base
Object e ne eredità metodi e proprietà (come in
ogni altro caso di derivazione…)
Object
SUBCLASS
Classe DERIVATA / FIGLIA
SUPERCLASS
Classe PADRE
Square
Rectangle
this è.. Rectangle
super è Object
this è.. this… cioè Square
super è Rectangle
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: e se la logica la portiamo nelle classi?
Rectangle.java
package it.unibs.eps;
Una classe come una struttura può incapsulare
attributi (fields) ma non solo… può anche
incapsulare logica applicativa (costruttori e
metodi). Possiamo avere metodi che si applicano
alla classe (static) e metodi che si applicano agli
oggetti (non static)
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public static int perimeter(Rectangle r) {
return (r.width + r.height) * 2;
}
public static int area(Rectangle r) {
return r.width * r.height;
}
}
Rectangle r1 = new Rectangle(5,4);
Rectangle r2 = new Rectangle(9,13);
int p1 = Rectangle.perimeter(r1);
int p2 = Rectangle.perimeter(r2);
Possiamo fare meglio… possiamo avere metodi che si applicano alla classe (static) ma anche metodi che
si applicano agli oggetti (non static) e ne utilizzano direttamente i valori…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: metodi di istanza
Rectangle.java
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
perimetro e area sono metodi di istanza, metodi
che possono essere invocati tramite un’istanza di
una classe Rectangle (cioè un oggetto di tipo
rectangle come r1 o r2).
public int perimeter() {
return (this.width + this.height) * 2;
}
I metodi vengono invocati nel contesto
dell’oggetto corrente, quindi al loro interno
possiamo accedere ad attributi e metodi
dell’oggetto valorizzati in funzione dell’oggetto
chiamante.
public int area() {
return this.width * this.height;
}
La parola chiave this in questo caso può anche
essere omessa.
}
Rectangle r1 = new Rectangle(5,4);
Rectangle r2 = new Rectangle(9,13);
int p1 = r1.perimeter();
int p2 = r2.perimeter();
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: i metodi come gli attributi si ereditano…
Rectangle.java
Square.java
package it.unibs.eps;
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
public class Square extends Rectangle {
public Square(int size)
super(size, size);
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
{
?
}
public int perimeter() {
return (width + height) * 2;
}
Square s = new Square(9);
System.out.printf(“Perim. quad.: %d\n", s.perimeter());
public int area() {
return width * height;
}
}
Tutto viene ereditato…
Basta modificare Rectangle e Square assume nuove
caratteristiche…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java: override di metodi
Rectangle.java
Square.java
package it.unibs.eps;
package it.unibs.eps;
public class Rectangle {
public int width;
public int height;
public class Square extends Rectangle {
public Square(int size)
super(size, size);
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int perimeter() {
return (width + height) * 2;
}
{
public int perimeter() {
return height * 4;
}
}
public int area() {
return width * height;
}
}
E’ possibile ridefinire in una classe derivata un
metodo definito in una classe base (override).
In questo modo è possibile cambiare il
comportamento del metodo per gli oggetti della
classe specificata.
Rimane possibile richiamare i metodi della classe
base tramite super
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Square s = new Square(9);
System.out.printf(“Perim. quad.: %d\n", s.perimeter());
Java vs C: dopo aver riorganizzato il codice…
main.c
#include <stdio.h>
typedef struct Rectangle_ST…
int perimeter(Rectangle_T r)…
int area(Rectangle_T r)…
System.out.printf(“P.R.: %d\n", r.perimeter());
System.out.printf(“A.R.: %d\n", r.area());
typedef struct Square_ST {
int width;
int height;
} Square_T;
System.out.printf(“P.Q.: %d\n", s.perimeter());
System.out.printf(“A.Q.: %d\n", s.area());
}
int perimeter_sq(Square_T r){
return (r.width + r.height) * 2;
}
}
Rectangle.java
int area_sq(Square_T r){
return r.width * r.height;
}
int main(void) {
Rectangle_T r;
Square_T s;
r.height = 5;
Main.java
…
public class Main {
public static void main(String[] args) {
Rectangle r = new Rectangle(5, 7);
Square s = new Square(9);
…
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width; this.height = height;
r.width = 8;
s.height = s.width = 9;
public int perimeter() { return (width+height)*2; }
public int area() { return width * height;
}
printf("Perimetro rettangolo: %d\n", perimeter(r));
printf("Area rettangolo: %d\n", area(r));
printf("Perimetro quad.: %d\n", perimeter_sq(s));
printf("Area quadrato: %d\n", area_sq(s));
return 0;
}
}
}
Square.java
…
public class Square extends Rectangle {
public Square(int size) {
super(size, size);
}
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
terzo tempo
Ellipses & Circles
perimeter
Shape2d
area
draw
xAxis
yAxis
radius
Ellipse
Rectangle
Circle
Square
Diamond
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
ma le nostre astronavi ci creano
qualche problema…
Come relaziono le astronavi al resto degli oggetti?
draw
perimeter
area
…e soprattutto le astronavi NON sono forme ma sono astronavi…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Interfacce
draw
draw
Spaceship
speed
armor
Alfa
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Interfacce
IDrawable.java
IDrawable
public interface IDrawable {
public void draw();
}
draw
implements
draw
Spaceship
speed
armor
Alfa
… e le collezioni di oggetti si riferiscono all’interfaccia funzionale di riferimento…
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
determinazione dei tipi compile time & run time
compile time
instanceof / (casting)
if(s instanceof Shape2d)
perimetro = ((Shape2d)s).perimeter());
run time
o.class.isInstance() / class.cast(o)
public boolean areObjectsAssignable(Object src, Object dest) {
return dest.getClass().isInstance(src);
}
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Java I/O
Navigare nella struttura del File System
File & Directory
File class: permette la gestione dei file
a livello di file system
Elenco dei file
Accesso agli attributi
Cancellazione
Cambio nome
…
Non permette di accedere ai contenuti
del file (!)
Perché chiamarlo File? ottima domanda!
createNewFile();
delete();
deleteOnExit();
exists();
isAbsolute();
isDirectory();
isFile();
isHidden();
list();
listFiles();
mkdir();
mkdirs();
renameTo();
setLastModified();
setReadOnly();
canRead();
canWrite();
getCanonicalPath();
getAbsolutePath();
getCanonicalFile();
getAbsoluteFile();
Vedi jEx020
I/O in Java
Ma chi l’ha pensato a cosa pensava?
Stream (vista semplificata)
InputStream
OutputStream
specializzati per:
• array of byte
• string
• file
• pipe
• stream sequence
• altro (es. internet connection)
specializzati per:
• array of byte
• file
• pipe
• stream sequence
• altro (es. internet connection)
readers
BufferedReader
writers
Testo
BufferedWriter
PrintWriter
DataInputStream
Binari
DataOutputStream
Leggere un file di testo
BufferedReader
READ
public static String read(String fname) {
BufferedReader in;
try {
in = new BufferedReader(new FileReader(fname));
try
{
int lcount = 1;
String s;
StringBuilder sb = new StringBuilder();
while((s = in.readLine()) != null)
sb.append(String.format("%3d| %s\n", lcount++, s));
return sb.toString();
} finally {
in.close();
}
} catch(IOException ex) {
throw new RuntimeException(ex);
}
}
Scrivere un file di testo
BufferedWriter
PrintWriter
READ
public static void write(String fname, String body) {
BufferedWriter out;
try {
out = new BufferedWriter(new FileWriter(fname));
// oppure: PrintWriter out = new PrintWriter(fname);
try {
out.write(body);
} finally {
out.close();
}
} catch(IOException ex) {
throw new RuntimeException(ex);
}
}
IO Binario
DataInputStream
DataInputStream in =
new DataInputStream(
new BufferedInputStream(
new FileInputStream(fin)));
DataOutputStream
DataOutputStream in =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(fin)));
RandomAccessFile
RandomAccessFile rf =
new RandomAccessFile(fin, "rw");
E poi vene NIO (New Input Output)
e il mistero si infittisce…
Canali e Buffer
Channel
buffer
File
FileInputStream
FileOutputStream
RandomAccessFile
Assignment
Assignment J01
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi
Assignment C01
Equivalente (con le dovute differenze) di J01
Programmazione Avanzata Java e C - 2015/106 - (C) Massimiliano Redolfi