2011-05-25 16 views
8

Prácticamente cada ejemplo de código lee un archivo TXT línea por línea y lo almacena en una matriz String. No quiero procesar línea por línea porque creo que es una pérdida innecesaria de recursos para mis requisitos: todo lo que quiero hacer es volcar rápida y eficientemente el contenido .txt en una sola Cadena. El método a continuación hace el trabajo, sin embargo, con un inconveniente:¿Cómo puedo leer un archivo .txt en una sola cadena de Java mientras mantengo los saltos de línea?

private static String readFileAsString(String filePath) throws java.io.IOException{ 
    byte[] buffer = new byte[(int) new File(filePath).length()]; 
    BufferedInputStream f = null; 
    try { 
     f = new BufferedInputStream(new FileInputStream(filePath)); 
     f.read(buffer); 
     if (f != null) try { f.close(); } catch (IOException ignored) { } 
    } catch (IOException ignored) { System.out.println("File not found or invalid path.");} 
    return new String(buffer); 
} 

... el inconveniente es que los saltos de línea se convierten en espacios largos, por ejemplo, "                               ".

Quiero convertir los saltos de línea de \ n o \ r a <br> (etiqueta HTML).

Gracias de antemano.

+0

He intentado añadir este método para convertir los saltos de línea del archivo de texto en HTML
etiquetas, pero no funcionó: string.replaceAll ("(\ r \ n | \ n)", "
"); – slashline

+1

Procesarlo línea por línea será igual de eficiente (si no más) que volcar todo el archivo, luego retroceder y reemplazar saltos de línea con las etiquetas
' –

+0

Realmente, un ciclo que pasa por cada línea es igual de eficiente ? Interesante ... podría ir con eso entonces. ¡Gracias! – slashline

Respuesta

3

¿Qué pasa con el uso de un escáner y la adición de los avances de línea a sí mismo:

sc = new java.util.Scanner ("sample.txt") 
while (sc.hasNext()) { 
    buf.append (sc.nextLine()); 
    buf.append ("<br />"); 
} 

no lo hago mira de donde obtienes tus espacios largos.

+0

Este es todavía el procesamiento línea por línea, pero alguien dijo que no es más lento que directamente volcar un archivo .txt en una cadena básica. Entonces podría hacer un procesamiento línea por línea, pero pero esto hace surgir una pregunta: ¿Cuál es más rápido, Scanner o BufferedReader? – slashline

+0

Si no nota la diferencia, ¿tal vez no sea tan grande? Para tamaños típicos de páginas html, no esperaría una diferencia relevante. Hay tantas influencias posibles (velocidad del disco duro, disco duro, sistema operativo, tamaño de archivo, versión java, ...) que debe hacer sus mediciones en un sistema cercano al sistema de destino y con una entrada similar. –

+0

¿No es esto suponiendo que la última línea del archivo también debería tener un salto de línea? Eso podría ser peligroso en ciertos casos. –

1

Se podría añadir este código:

return new String(buffer).replaceAll("(\r\n|\r|\n|\n\r)", "<br>"); 

¿Es esto lo que busca?

+0

Eso no funcionará. Creo que el problema es que la variable ** buffer ** es ** byte **, por lo que no tiene \ r \ n. En lugar de \ r \ n tiene espacios ... lo que hace que sea más difícil insertar
correctamente. – slashline

+0

Lo he probado en una PC con Windows y funciona correctamente. –

1

El código leerá el contenido del archivo tal como aparece en el archivo, incluidos los saltos de línea. Si desea cambiar los saltos a algo más como mostrar en html, etc., deberá procesarlo o hacerlo leyendo el archivo línea por línea. Puesto que usted no desea que esta última, se puede sustituir su declaración por el siguiente que debe hacer la conversión -

return (new String(buffer)).replaceAll("\r[\n]?", "<br>"); 
+0

Esto tampoco funcionó. Creo que el problema es que la variable ** buffer ** es ** byte **, por lo que los \ r \ n probablemente se eliminen. En lugar de \ r \ n tiene espacios ... lo que hace que sea más difícil insertar
correctamente. – slashline

+0

\ r y \ n son ascii 10 y 13 respectivamente. No estoy de acuerdo con ellos no pueden caber en byte. Pruebe el reemplazo de todos modos: no veo ninguna razón por la cual no funcionará; de lo contrario, deberá inspeccionar su archivo fuente si tiene alguno de esos caracteres. O pruebe el código con cualquier otro archivo de texto creado con el bloc de notas, etc. Si ve algún cambio, deberá indicarnos qué tipo de archivo de texto está utilizando. –

0
StringBuilder sb = new StringBuilder(); 
     try { 
      InputStream is = getAssets().open("myfile.txt"); 
      byte[] bytes = new byte[1024]; 
      int numRead = 0; 
      try { 
       while((numRead = is.read(bytes)) != -1) 
        sb.append(new String(bytes, 0, numRead)); 
      } 
      catch(IOException e) { 

      } 
      is.close(); 
     } 
     catch(IOException e) { 

     } 

su resultante String: String result = sb.toString();

continuación, vuelva a colocar lo que quiera en este result.

3

Usted puede leer directamente en la memoria intermedia y luego crear una cadena de la memoria intermedia:

File f = new File(filePath); 
    FileInputStream fin = new FileInputStream(f); 
    byte[] buffer = new byte[(int) f.length()]; 
    new DataInputStream(fin).readFully(buffer); 
    fin.close(); 
    String s = new String(buffer, "UTF-8"); 
0

Usted debe tratar org.apache.commons.io.IOUtils.toString (InputStream es) para obtener el contenido de archivos como Cuerda. Allí puede pasar el objeto InputStream que obtendrá de

getAssets().open("xml2json.txt") *<<- belongs to Android, which returns InputStream* 

en su Actividad.Para conseguir esta cadena utilizan:

String xml = IOUtils.toString((getAssets().open("xml2json.txt"))); 

Así,

String xml = IOUtils.toString(*pass_your_InputStream_object_here*); 
+0

¿No es 'getAssets' específico para Android? – demongolem

+0

@demongolem Sí. Pero la clase IOUtils es de Java y su método toString funcionará como solución. Estoy de acuerdo, necesito ser específico en ans. Gracias por el recordatorio. –

0

Estoy de acuerdo con el planteamiento general por @Sanket Patel, pero usando los Comunes de E/S probablemente quiera File Utils.

Por lo que su palabra código se parece a:

String myString = FileUtils.readFileToString(new File(filePath)); 

También hay otra versión para especificar una codificación de caracteres alternativo.

Cuestiones relacionadas