Post

Visualizzazione dei post da 2012

Creare PDF da un XML con Apache FOP 1.1

DOMANDA: Come si crea un PDF da un file XML? RISPOSTA: E' possibile creare un PDF a partire da un XML con Apache FOP 1.1 , ultima versione attualmente disponibile. E' indispensabile sapere che per la trasformazione è necessario un file "intermedio" .xsl utilizzato come template (modello) in cui vengono conservate le informazioni di impaginazione. Come al solito, guardiamo con degli esempi ad hoc  ogni singolo step anche se, in questo post, si da per scontata una conoscenza basilare di xml ed xsl . La seguente classe Xml2Pdf trasforma l' XML in PDF grazie alle informazioni contenute nel .xsl : package fop; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResu

Differenza tra JRE e JDK

DOMANDA: Che differenza c'è tra Java Runtime Environment (JRE) e Java Development Kit (JDK)? RISPOSTA: Se la vostra esigenza è quella di eseguire delle applicazioni Java , è sufficiente la JRE . Infatti Java Runtime Enviroment è un'implementazione della Java Virtual Machine (JVM) necessaria per far girare i programmi Java sul vostro calcolatore. E' quindi necessaria la JRE per eseguire ad esempio Eclipse , le applet , Tomcat , ecc... La JDK invece è indispensabile nel caso voi abbiate la necessità di sviluppare software Java. Infatti la JDK contiene al suo interno una o più JRE e  tutti gli applicativi utili per la programmazione in Java: debuggers, compilatori come javac, librerie per lo sviluppo, ecc... Sono entrambe gratuite e scaricabili dal sito ufficiale  Oracle Java . NOTA : per Eclipse è sufficiente la JRE perché al suo interno contiene già il compilatore, le librerie e i tools necessari al programmatore.

Codifica e decodifica di un'immagine in Base64

DOMANDA: Come si effettua la codifica in Base64 di un'immagine in Java? RISPOSTA: Differentemente da quanto visto per la codifica Base64 delle stringhe , per le immagini abbiamo alcune varianti dovute soprattutto alla conversione della stessa in un array di byte . Scarichiamo la classe Base64 di Apache Commons contenuta nel pacchetto  commons-codec-1.2.jar . Il codice nell'esempio mostra come convertire in Base64  un'immagine JPG, ma è adattabile anche ad altri formati: package base64; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.commons.codec.binary.Base64; public class Base64ImgConversion { public static void main(String[] args) throws IOException { BufferedImage immagine = ImageIO.read(new File("C:\\immagine.jpg")); ByteArrayOutputStream byteArrOS = new ByteArrayOutputStream(); ImageIO.write(imm

Codifica e decodifica di una stringa in Base64

DOMANDA: Come si converte una stringa in Base64 con Java? RISPOSTA: In Java esiste una classe chiamata Base64 della libreria Apache Commons che permette in pochi passi di convertire una stringa in Base64 . Scarichiamo quindi il pacchetto   commons-codec-1.2.jar   ed importiamolo nel nostro progetto. Una volta effettuate correttamente queste operazioni, guardiamo l'esempio che effettua codifica e decodifica : package base64; import org.apache.commons.codec.binary.Base64; public class Base64Conversion { public static void main(String[] args) { String daConvertire = "Stringa originale"; // CODIFICA BASE64 byte[] encoded = Base64.encodeBase64(daConvertire.getBytes()); System.out.println("Stringa da convertire: " + daConvertire ); System.out.println("Base64: " + new String(encoded)); // DECODIFICA BASE64 byte[] decoded = Base64.decodeBase64(encoded); System.out.println("Stringa decodificata : " + new St

Comprimere e convertire immagini in JPG

DOMANDA: Come convertire un'immagine in JPG in Java? RISPOSTA: Java  mette a disposizione diversi oggetti che permettono la conversione di un'immagine in JPG/JPEG e anche la regolazione della compressione (e quindi della qualità). Guardiamo l'esempio TestCompressione , opportunamente commentato per capire tutti i passaggi da intraprendere: package immagini; import java.awt.image.*; import java.io.*; import java.util.Iterator; import javax.imageio.*; import javax.imageio.stream.FileImageOutputStream; import javax.swing.JFileChooser; public class TestCompressione { public static void main(String args[]) throws Exception { BufferedImage immagine = null; // Seleziono il file con finestra di dialogo JFileChooser fileScelto = new JFileChooser("C:\\"); int selezione = fileScelto.showDialog(null, "Seleziona il file da aprire"); if(selezione == JFileChooser.APPROVE_OPTION) immagine = ImageIO.read(fileScelto.getSelectedFile(

Differenza tra equals() ed ==

Immagine
DOMANDA: Che differenza c'è tra il metodo equals() e ==? RISPOSTA: Utilizzare il metodo equals(Object o) ereditato da Object() o utilizzare l' operatore di confronto == è estremamente differente.  METODO equals() Utilizzando questo metodo stiamo confrontando due oggetti secondo dei criteri di uguaglianza di contenuto , cioè potremmo confrontare una persona con un'altra persona, un animale con un altro animale e così via. Il metodo equals() permette infatti, con opportune personalizzazioni, di selezionare quali sono i criteri di confronto. Così potremo decidere se una persona è uguale ad un'altra se hanno nome e cognome uguali, oppure nome, cognome e data di nascita, ecc... ecc... OPERATORE == Questo operatore di confronto valuta l'uguaglianza sostanziale, ovvero se l'oggetto, il riferimento o il tipo di dato primitivo a sinistra è effettivamente lo stesso di quello a destra. Quindi risulterà vero soltanto quando i riferimenti di memori

Rappresentare numeri grandissimi

DOMANDA: E' possibile rappresentare in Java dei numeri grandissimi che hanno un valore oltre quello consentito dai tipi di dati primitivi long e int? RISPOSTA: Come abbiamo visto nel post sul range di valori rappresentabili con i diversi tipi di dati primitivi, effettuare un'operazione il cui risultato vada oltre tale limite comporta un errore di calcolo con conseguenze potenzialmente disastrose. La soluzione a tali limitazioni esiste: la prima, più complessa, rientra nell'analisi numerica e in algoritmi di troncamento, arrotondamento e bit shifting, ma non è scopo di questo post. La seconda invece è messa a disposizione da Java con le classi java.math.BigInteger e java.math.BigDecimal (rispettivamente per i numeri interi e decimali). Guardiamo con un esempio come funzionano: package bignumbers; import java.math.BigInteger; public class BigNumbers { public static void main(String[] args) { // rappresentazione errata oltre i limiti

Stampare un file su carta

DOMANDA: Come si manda in stampa un file in Java? RISPOSTA: Ci sono diversi modi per stampare un file su carta direttamente da Java . Vediamo quello più veloce ed immediato grazie alla classe java.awt.Desktop introdotta a partire da Java 6: package stampa; import java.awt.Desktop; import java.io.File; import java.io.IOException; import javax.print.PrintException; public class StampaFile {   public static void main(String[] args) throws PrintException, IOException {     if(!java.awt.Desktop.isDesktopSupported()) {       System.out.println("Funzione non supportata!");       return;     }     try {       Desktop desk = java.awt.Desktop.getDesktop();       // mando in stampa il file       desk.print(new File("C:\\prova.pdf"));     } catch (NullPointerException | IllegalArgumentException | UnsupportedOperationException |         IOException | SecurityException ex) {       ex.printStackTrace();     }   } } Eseguendo questa classe invierete diret

Annotations: @Override

DOMANDA: Perché si utilizza l'annotazione @Override? A cosa serve e quali sono i vantaggi? RISPOSTA: @Override è una annotazione aggiunta a partire da Java 5 ed utilizzata per indicare al compilatore che il metodo su cui è posta sta effettuando un override (sovrascrittura) di un metodo della sua superclasse o, da Java 6 , anche di un'interfaccia. La domanda nasce spontanea: "cosa cambia se non lo utilizzo?" . Proviamo a fare un override sul metodo equals() della superclasse Object : public class Animale{ private String nome; public boolean equals(Animale animale){ return nome.equals(animale.nome); } } Come si nota non abbiamo utilizzato @Override ... e infatti non stiamo effettuando un override , bensì un overloading ! Sicuramente la maggior parte di voi non avrà fatto caso all'errore. Il metodo equals() ereditato della classe Object accetta come parametro un Object (non un Animale ), di conseguenza il compilatore riconoscerà il m

Java Reflection: accesso a metodi e campi privati

DOMANDA: Come si può accedere da un classe generica ai metodi e alle variabili di istanza private di un'altra classe? RISPOSTA: Genericamente non è possibile accedere ai campi o metodi privati  di un'altra classe. Ma g enericamente non vuol dire in modo assoluto! Infatti, grazie alla Reflection Java possiamo accedere ai campi privati di un'altra classe. Analizziamo alcuni metodi che ci mette a disposizione la classe java.lang.Class : getFields() : permette di recuperare la lista di tutti i campi pubblici della classe e della sua superclasse; getDeclaredFields() : fornisce la lista di tutti i campi presenti nella classe (senza distinzione di visibilità); getDeclaredMethods() : come sopra ma applicato ai metodi; getDeclaredField(String nome) : restituisce il Field indicato come parametro (senza distinzione di visibilità); getDeclaredMethos(String nome) : restituisce il Method indicato come parametro (senza distinzione di visibilità). Guardiamo l&

Java 7: Multicatch

DOMANDA: In un try/catch c'è modo di scrivere più eccezioni nello stesso catch evitando così codice ridondante nel caso di stesso comportamento? RISPOSTA: Fino a Java 6 succede una cosa alquanto scomoda nell'utilizzo del try/catch : quando ci troviamo di fronte ad un codice che ha lo stesso comportamento con diverse eccezioni , siamo costretti a dover ripetere lo stesso codice più volte dentro diversi catch . Guardiamo nel dettaglio un esempio in cui posso avere due eccezioni a runtime : una NumberFormatException qualora inserisca in input un formato non compatibile con la conversione in int (ad esempio delle lettere), oppure una ArithmeticException qualora inserisca un numero non compreso nell'intervallo 0 e 5 (estremi esclusi): package multicatch; import java.util.Scanner; public class OldCatch { public static void main(String args[]) { try { Scanner scanner = new Scanner(System.in); String number = scanner.next(); scanner.clos

Creare una finestra di scelta file con JFileChooser

Immagine
DOMANDA: Come si fa a visualizzare una finestra per la scelta di un file in Java? RISPOSTA: Java mette a disposizione la classe javax.swing.JFileChooser che permette di aprire con poche righe di codice una finestra di selezione (Dialog) per i file . Guardiamo l'esempio con la classe FileDialog : package file; import java.io.File; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; public class FileDialog { public static void main(String[] args) { // impostazione della directory di partenza JFileChooser fileScelto = new JFileChooser("C:\\"); // creazione di due filtri FileFilter filtroJpg = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg"); FileFilter filtroTxt = new FileNameExtensionFilter("TXT file", "txt"); // inserisco nella scelta del tipo di file un filtro TXT fileScelto.

Visualizzare la data di ultima modifica di un file

DOMANDA: Come si visualizza la data dell'ultima modifica di un file in Java? RISPOSTA: Tra le tante possibilità offerte dalla classe java.io.File , vi è anche quella di visualizzare l' ultima modifica di un file . Guardiamo subito con un esempio quanto è semplice: package file; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; public class UltimaModifica {   public static void main(String args[]) {     try {        File file = new File("C:\\image.jpg");        if(file.exists()) {          // recupero la data di ultima modifica          long ultimaMod = file.lastModified();          Date data = new Date(ultimaMod);          // formatto la data          SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/YYYY HH:mm:ss");          String dataMod = dateFormat.format(data);          System.out.println("Ultima modifica del file " + file.getName() + ": " + dataMod);        } else {        

Java System Properties

DOMANDA: In Java si possono ricavare le proprietà di sistema a runtime? RISPOSTA: Per personalizzare a runtime i programmi, evitare di scrivere codice non multipiattaforma o semplicemente ricavare le informazioni specifiche di un calcolatore è necessario conoscere la possibilità fornita da Java di recuperare i dettagli del sistema su cui è in esecuzione il nostro programma. Le possibilità offerte dalle Java System Properties sono quelle elencate nella seguente tabella: System property Descrizione java.version Versione Java Runtime Environment (JRE) java.vendor Fornitore Java Runtime Environment (JRE) java.vendor.url URL fornitore Java java.home Directory di installazione Java java.vm.specification.version Versione delle specifiche della Java Virtual Machine java.vm.specification.vendor Fornitore delle specifiche della Java Virtual Machine java.vm.specification.name Nome delle specifiche della Java Virtual Machine java.vm.version Versione dell'implementazion

Keywords: Volatile - Descrizione ed esempio

DOMANDA: Cosa significa la keyword volatile in Java? RISPOSTA: La keyword volatile è di solito associata ad una variabile il cui valore viene salvato e ricaricato in memoria ad ogni accesso senza utilizzare i meccanismi di caching . Spesso viene utilizzata quando differenti threads devono accedere ad una stessa variabile. Nell'esempio di seguito, non dichiarare la variabile volatile potrebbe portare il primo Thread a non terminare mai: package volatiletest; public class VolatileTest { volatile boolean running = true; // da notare la parola chiave volatile public void test() { // lancio un primo Thread new Thread(new Runnable() { public void run() { int counter = 0; while (running) counter++; System.out.println("Thread 1 concluso. Contatore = " + counter); } }).start(); // lancio il secondo Thread new Thread(new Runnable() { public void run() {

Il Polimorfismo: descrizione ed esempi

DOMANDA: Che cos'è il polimorfismo in Java? RISPOSTA: Uno degli elementi fondamentali della programmazione ad oggetti (e quindi anche di Java) è proprio il polimorfismo . Con questo termine, scomponendo ad intuito, possiamo dedurne il significato: poli - morfismo -> multi-forme (non formalizziamoci sull'etimologia del termine).  Proprio come suggerito dall'intuito, il polimorfismo altro non è che la capacità di un oggetto di poter assumere diverse forme. Il concetto è spesso ostico ai neofiti della programmazione ad oggetti, ma in realtà, con un esempio pratico si può cominciare a capire la potenza di questo sistema. ESEMPIO Un leone, una mucca e un cavallo avranno tutti e tre la capacità di emettere un proprio verso. Vediamolo nel dettaglio: package polimorfismo; public class Leone { public void emettiVerso(){ System.out.println("RUGGITO"); } } package polimorfismo; public class Mucca { public void emettiVerso(){ System.out.pr

Differenza tra jsp:include e @ include file

DOMANDA: Che differenza c'è tra:  <%@ include file="pagina.jsp" %>  e  <jsp:include page="pagina.jsp">? RISPOSTA: Cerchiamo di spiegare brevemente la differenza e subito dopo ne vedremo gli effetti con dei semplici esempi. DIRETTIVA @INCLUDE <%@ include file="pagina.jsp" %> E' una direttiva che richiama il file indicato tra virgolette (nel nostro esempio pagina.jsp ) facendolo diventare parte della pagina in cui è incluso. Detto in parole semplici è come se facessimo un copia e incolla del contenuto del file pagina.jsp in corrispondenza dell'inclusione. Questo implica che non è necessario includere un file specifico, ma viene accettata qualunque tipologia, anche un semplice .txt . DIRETTIVA JSP:INCLUDE <jsp:include page="pagina.jsp"> In questo caso invece non avviene una semplice sostituzione. Il file indicato come valore dell'attributo page, viene compilato separatamente com