2011-11-30 14 views
11

Tengo una sola Cadena codificada en UTF-8 que es una cadena de pares clave + valor que se debe cargar en un objeto Propiedades. Me di cuenta de que estaba obteniendo caracteres ilegibles con mi implementación inicial y después de buscar en Google, encontré este Question que indicaba cuál era mi problema, básicamente que Properties está usando por defecto ISO-8859-1. Esta implementación se parecía aCadena Java codificada en UTF-8 en las Propiedades

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; 
    } 

No se especificó ninguna codificación, de ahí mi problema. A mi pregunta, no puedo averiguar cómo encadenar/crear una combinación de Reader/InputStream para pasar al Properties.load() que usa el propertiesString provisto y especifica la codificación. Creo que esto se debe principalmente a mi inexperiencia en las secuencias de E/S y la biblioteca aparentemente enorme de utilidades de IO en el paquete java.io.

Cualquier consejo apreciado.

Respuesta

13

Use un Reader cuando trabaje con cadenas. InputStream s son realmente para datos binarios.

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

ese constructor no existe. – BalusC

+0

Gracias, hice checkout [StringReader] (http://docs.oracle.com/javase/6/docs/api/java/io/StringReader.html), pero no vi tal constructor. – markdsievers

+0

Cheers Matt, acabo de probar esta solución con éxito. No usé StringReader inicialmente porque tenía mis anteojeras buscando control sobre la codificación. Muchas gracias por su ayuda. Voto + acepta para ti mi amigo. – markdsievers

1

Prueba esto:

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

Tuve que usar esto en lugar del 'StringReader' para admitir Android SDK anteriores a 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; 
    } 

entonces el uso

System.out.println(getProperties().getProperty("key")) 
Cuestiones relacionadas