Post

Visualizzazione dei post da novembre, 2012

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