Estoy trabajando con LogManager.readConfiguration()
que requiere un InputStream cuyo contenido me gustaría obtener de una cadena. ¿Hay un equivalente de StringBufferInputStream
que no esté en desuso, como ReaderToInputStreamAdaptor
?StringBufferInputStream equivalente no obsoleto
Respuesta
Documentación de LogManager.readConfiguration()
dice que acepta datos en formato java.util.Properties
. Por lo tanto, la realidad correcta aplicación de codificación de seguridad es la siguiente:
String s = ...;
StringBuilder propertiesEncoded = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c <= 0x7e) propertiesEncoded.append((char) c);
else propertiesEncoded.append(String.format("\\u%04x", (int) c));
}
ByteArrayInputStream in = new ByteArrayInputStream(propertiesEncoded.toString().getBytes("ISO-8859-1"));
EDIT: algoritmo de codificación corregido
Edit2: En realidad, java.util.Properties
formato tiene algunas otras restricciones (como escapar de \
y otra caracteres especiales), vea los documentos
EDIT3: 0x00-0x1f escapando eliminado, como Alan Moore sugiere
Ver java.io.ByteArrayInputStream
String s = "test";
InputStream input = new ByteArrayInputStream(s.getBytes("UTF8"));
Esto no funcionará. 'readConfiguration()' pasa la secuencia a 'Properties # load (InputStream)', y ese método espera que la transmisión sea 'ISO-8859-1', no' UTF-8'. –
Luego puede pasar la codificación ISO-8859-1 a getBytes() – Kevin
Utilice la ByteArrayInputStream, y tenga cuidado al especificar una codificación de caracteres apropiado. p.ej.
ByteArrayInputStream(str.getBytes("UTF8"));
Debe preocuparse por la codificación de caracteres para determinar cómo cada carácter se convierte en un conjunto de bytes. Nota Puede utilizar el método predeterminado getBytes()
y especificar la codificación de la JVM se ejecuta a través de la -Dfile.encoding=...
Esto no funcionará. 'readConfiguration()' pasa la secuencia a 'Properties # load (InputStream)', y ese método espera que la transmisión sea 'ISO-8859-1', no' UTF-8'. –
- 1. equivalente de no obsoleto de <form target = "...">
- 2. Cómo reemplazar StringBufferInputStream con StringReader?
- 3. Equivalente al atributo obsoleto <seg: autorizar> ifNotGranted
- 4. HTML obsoleto frente a obsoleto
- 5. significado obsoleto?
- 6. initWithContentsOfFile Obsoleto
- 7. File.toURL() obsoleto?
- 8. glEnableClientState obsoleto
- 9. stringWithContentsOfFile Obsoleto
- 10. dismissModalViewControllerAnimated obsoleto
- 11. Enum.ToString() obsoleto?
- 12. ¿Cómo marcar algo en Qt como obsoleto (obsoleto)?
- 13. Marcar como obsoleto
- 14. Es livequery obsoleto
- 15. es c3p0 obsoleto?
- 16. ¿Auto_ptr está obsoleto?
- 17. ¿LDAP está obsoleto?
- 18. iOS6 viewDidUnload Obsoleto
- 19. Uso del atributo obsoleto
- 20. Enum obsoleto C#
- 21. ¿Hash Rocket está obsoleto?
- 22. Rails 3 new_record? obsoleto
- 23. StringBuffer está obsoleto?
- 24. Fluido NHibernate JoinedSubClass obsoleto
- 25. de Split() obsoleto
- 26. load() método obsoleto?
- 27. selector de niño obsoleto
- 28. Hibernate - AnnotationConfiguration obsoleto
- 29. ConfigurationSettings.AppSettings es obsoleto, advertencia
- 30. TWTweetComposeViewController obsoleto en IOS6
Buena captura en codificación Unicode específica para el formato de archivo de propiedades. Creo que esto es correcto siempre que 's' sea UTF-8. –
@Kaleb: 's' solo será una Cadena, en la misma codificación que siempre usa Strings, no necesita preocuparse por eso. Solo tiene que saber la codificación * target *, que es 'ISO-8859-1' como dijo @axtavt. –
@axtavt: su código saldrá de Unicode de todos los caracteres TAB, avance de línea, avance de carro y devolución de carro, lo cual no es correcto. Esos solo necesitan ser escapados si son parte de una clave o elemento de Propiedades, y eso ya debería haberse solucionado cuando se llame a este método. –