Supongamos que acabo de utilizar a BufferedInputStream
para 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
Charset
argumento 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
InputStream
vía anInputStreamReader
en 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
UnsupportedEncodingException
lo 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