Supongamos que acabo de utilizar a BufferedInputStreampara leer los bytes de un archivo de texto codificado UTF-8 en una matriz de bytes. Sé que puedo usar la siguiente rutina para convertir los bytes en una cadena, pero ¿hay una manera más eficiente / inteligente de hacer esto que simplemente iterar a través de los bytes y convertir cada uno?
public String openFileToString(byte[] _bytes)
{
String file_string = "";
for(int i = 0; i < _bytes.length; i++)
{
file_string += (char)_bytes[i];
}
return file_string;
}

String fileString = new String(_bytes,"UTF-8");?byte[]en la memoria y convertirlo a través denew String(_bytes,"UTF-8")(o incluso por fragmentos con+=la cadena) sea lo más eficiente. El encadenamiento de InputStreams y lectores podría funcionar mejor, especialmente en archivos grandes.Respuestas:
Mira el constructor de String
Y si se siente flojo, puede usar la biblioteca IO de Apache Commons para convertir el InputStream en una cadena directamente:
fuente
java.nio.charset.Charset.availableCharsets()mapa de todos los conjuntos de caracteres, no solo los conjuntos de caracteresStandardCharsets. Y si desea usar algún otro juego de caracteres y aún así quiere evitar que el constructor de cadenas se lanceUnsupportedEncodingException, puede usarjava.nio.charset.Charset.forName()La clase Java String tiene un constructor incorporado para convertir la matriz de bytes en una cadena.
fuente
Para convertir datos utf-8, no puede asumir una correspondencia 1-1 entre bytes y caracteres. Prueba esto:
(Bah. Veo que soy lento para presionar el botón Publicar su respuesta).
Para leer un archivo completo como una cadena, haga algo como esto:
fuente
Puedes usar el
String(byte[] bytes)constructor para eso. Vea este enlace para más detalles. EDITAR También debe tener en cuenta el juego de caracteres predeterminado de su plataforma según el documento de Java:fuente
Charsetargumento para asegurarse de que la conversión sea correcta.Puede usar los métodos descritos en esta pregunta (especialmente desde que comienza con un InputStream): Lea / convierta un InputStream en una Cadena
En particular, si no desea confiar en bibliotecas externas, puede probar esta respuesta , que lee la
InputStreamvía anInputStreamReaderen unchar[]búfer y la agrega a unaStringBuilder.fuente
Sabiendo que está tratando con una matriz de bytes UTF-8, definitivamente querrá usar el constructor de cadenas que acepte un nombre de conjunto de caracteres . De lo contrario, puede dejar algunas vulnerabilidades de seguridad basadas en la codificación de caracteres. Tenga en cuenta que arroja
UnsupportedEncodingExceptionlo que tendrá que manejar. Algo como esto:fuente
Aquí hay una función simplificada que leerá en bytes y creará una cadena. Supone que probablemente ya sepa en qué codificación se encuentra el archivo (y, de lo contrario, está predeterminado).
fuente
La cadena tiene un constructor que toma byte [] y charsetname como parámetros :)
fuente
Esto también implica iterar, pero esto es mucho mejor que concatenar cadenas ya que son muy costosas.
fuente
String str = new String(byte[])hará bien.¿Por qué no obtener lo que está buscando desde el principio y leer una cadena del archivo en lugar de una matriz de bytes? Algo como:
luego lea la línea desde adentro hasta que esté lista.
fuente
Yo uso de esta manera
String strIn = new String(_bytes, 0, numBytes);fuente