Visualizzazione post con etichetta Java. Mostra tutti i post
Visualizzazione post con etichetta Java. Mostra tutti i post

Java: parsing delle date con controllo di validità

    A chi non è mai capitato di dover parsare una stringa per convertirla in un oggetto Date?

La cosa è abbastanza banale in Java mediante l'oggetto java.text.SimpleDateFormat, ma va ricordato che il comportamento di default del metodo parse è "indulgente" (Lenient), ovvero effettua il controllo sintattico della stringa ma non semantico.
Cosa vuol dire in pratica? Ad es. la stringa "30/02/2010" è considerata una data valida anche se il 30 febbraio non esiste sul calendario, nessuna eccezione verrà sollevata e la stringa verrà convertita come java.util.Date in 02/03/2010.

Se tale comportamento non è quello che intendiamo ottenere dobbiamo ricordarci di settare a false l'apposita proprietà, come nell'esempio seguente, dove controlliamo che una stringa generica sia una data valida:

public static boolean isDate(String string) {
  try {
    SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy",Locale.ITALIAN);
    sf.setLenient(false);
    sf.parse(string);
    return true;
  } catch (Exception e) {
    return false;
  }
}

Java: caricare una risorsa interna in una applicazione esportata come JAR

     In questi giorni mi sono imbattuto nel seguente problema:
ho realizzato una applicazione che fa uso di un file di properties, l'ho testata, tutto ok.
Esportata come jar, però, la mia applicazione ha smesso di funzionare perché il file properties risultava non trovato (FileNotFoundException). Strano no? 
Il problema era evidentemente nel percorso del file...ma come fare a specificare un percorso relativo al contenuto del pacchetto jar?

Ho scoperto, con mia sorpresa, che ottenendo da un oggetto la sua classe di runtime è possibile invocare un metodo denominato getResourceAsStream(String name) che permette di ricercare una risorsa delegando tale compito al Class Loader che ha caricato la specifica classe. In questo modo la risorsa viene cercato nel contesto dell'applicazione, quindi nel mio caso all'interno del jar, ottenendo il risultato che cercavo. Ma vediamo il codice corrispondente, chiarirà ogni dubbio:

...
Properties p = new Properties();
p.load(this.getClass().getResourceAsStream("/myApp.properties"));
...
    
il file "myApp.properties" verrà ricercato nella root dell'archivio jar.
Importate è sottolineare la presenza del carattere "/" che precede il nome file per riferire come percorso la root. In assenza di questo, infatti, il file viene ricercato all'interno del package che contiene la classe riferita con this nel codice di esempio.