2011-11-30 16 views
11

Ho una singola stringa codificata UTF-8 che è una catena di coppie chiave + valore che è necessario caricare in un oggetto Proprietà. Ho notato che stavo ottenendo caratteri confusi con la mia implementazione iniziale e, dopo un po 'di googling, ho trovato questo Question che indicava qual era il mio problema - fondamentalmente che Proprietà è di default usando ISO-8859-1. Questa implementazione sembravaStringa Java codificata UTF-8 in Proprietà

public Properties load(String propertiesString) { 
     Properties properties = new Properties(); 
     try { 
      properties.load(new ByteArrayInputStream(propertiesString.getBytes())); 
     } catch (IOException e) { 
      logger.error(ExceptionUtils.getFullStackTrace(e)); 
     } 
     return properties; 
    } 

Nessuna codifica specificata, quindi il mio problema. Alla mia domanda, non riesco a capire come concatenare/creare una combinazione /InputStream per passare a Properties.load() che utilizza lo propertiesString fornito e specifica la codifica. Penso che ciò sia dovuto principalmente alla mia inesperienza nei flussi di I/O e alla libreria apparentemente vasta di utility IO nel pacchetto java.io.

Qualche consiglio apprezzato.

risposta

13

Utilizzare un Reader quando si lavora con le stringhe. InputStream s sono davvero pensati per i dati binari.

public Properties load(String propertiesString) { 
    Properties properties = new Properties(); 
    properties.load(new StringReader(propertiesString)); 
    return properties; 
} 
+0

Questo costruttore non esiste. – BalusC

+0

Grazie, ho eseguito il checkout [StringReader] (http://docs.oracle.com/javase/6/docs/api/java/io/StringReader.html), ma non ho visto tale costruttore. – markdsievers

+0

Cheers Matt, ho appena provato questa soluzione con successo. Inizialmente non ho usato StringReader perché avevo i miei paraocchi alla ricerca del controllo sulla codifica. Grazie mille per il tuo aiuto. Upvote + accetta per te il mio amico. – markdsievers

1

Prova questo:

ByteArrayInputStream bais = new ByteArrayInputStream(propertiesString.getBytes("UTF-8")); 
properties.load(bais); 
+1

Ho dovuto usare questo invece di 'StringReader' per supportare gli SDK Android più vecchi di Android-9. –

1
private Properties getProperties() throws IOException { 
     ClassLoader classLoader = getClass().getClassLoader(); 
     InputStream input = classLoader.getResourceAsStream("your file"); 
     InputStreamReader inputStreamReader = new InputStreamReader(input, "UTF-8"); 
     Properties properties = new Properties(); 
     properties.load(inputStreamReader); 
     return properties; 
    } 

quindi l'utilizzo

System.out.println(getProperties().getProperty("key")) 
Problemi correlati