1629 votos

Cómo crear un Java de la Cadena desde el contenido de un archivo?

He estado usando este modismo por algún tiempo ahora. Y parece ser la más extendida, al menos en los sitios que he visitado.

¿Alguien tiene una mejor forma diferente de leer un archivo en una cadena de caracteres en Java?

private String readFile( String file ) throws IOException {
    BufferedReader reader = new BufferedReader( new FileReader (file));
    String         line = null;
    StringBuilder  stringBuilder = new StringBuilder();
    String         ls = System.getProperty("line.separator");

    while( ( line = reader.readLine() ) != null ) {
        stringBuilder.append( line );
        stringBuilder.append( ls );
    }

    return stringBuilder.toString();
}

1686voto

erickson Puntos 127945

Lee todo el texto de un archivo

Aquí un compacto, robusto lenguaje de Java 7, envuelto en un método de utilidad:

static String readFile(String path, Charset encoding) 
  throws IOException 
{
  byte[] encoded = Files.readAllBytes(Paths.get(path));
  return new String(encoded, encoding);
}

Leer las líneas de texto de un archivo

Java 7 añadido una comodidad método para leer un archivo como líneas de texto, representado como un List<String>. Este enfoque es el de "pérdida", porque la línea de los separadores son despojados de la final de cada línea.

List<String> lines = Files.readAllLines(Paths.get(path), encoding);

La utilización de la memoria

El primer método, que preserva los saltos de línea, temporalmente puede requerir memoria de varias veces el tamaño de el archivo, ya que por un corto tiempo, el contenido de los archivos raw (una matriz de bytes), y el decodificado de caracteres (cada uno de los cuales es de 16 bits, incluso si codificados en 8 bits en el archivo) residen en la memoria a la vez. Lo más seguro es que se aplican a los archivos que saber ser pequeño en relación a la memoria disponible.

El segundo método, la lectura de las líneas, es generalmente más eficiente de la memoria, porque la entrada de bytes de buffer para la decodificación no necesita contener el archivo completo. Sin embargo, todavía no es el adecuado para los archivos que son muy grandes para el tamaño de la memoria disponible.

Para la lectura de archivos de gran tamaño, usted necesita un diseño diferente para su programa, uno que lee un fragmento de texto de un arroyo, la procesa, y luego pasa a la siguiente, la reutilización del mismo tamaño fijo bloque de memoria. Aquí, la "gran" depende de las características del equipo. Hoy en día, este umbral puede ser de varios gigabytes de memoria RAM.

Codificación de caracteres

Una cosa que falta de la muestra en el post original es la codificación de caracteres. Hay algunos casos especiales, donde la plataforma por defecto es lo que quieres, pero son raros, y deben ser capaces de justificar su elección.

La StandardCharsets clase de definir algunas constantes para las codificaciones requiere de todos los tiempos de ejecución de Java:

String content = readFile("test.txt", StandardCharsets.UTF_8);

La plataforma por defecto está disponible a partir de la Charset de la clase en sí:

String content = readFile("test.txt", Charset.defaultCharset());

Nota: Esta respuesta sustituye en gran medida a mi Java versión 6. La utilidad de Java 7 de forma segura simplifica el código, y la respuesta anterior, que utiliza un mapa de bytes de buffer, impidió que el archivo que se lea de ser eliminado hasta que el búfer asignado fue el recolector de basura. Puede ver la versión antigua a través de la "editar" que aparece en esta respuesta.

374voto

Willi aus Rohr Puntos 1744

Commons FileUtils.readFileToString:

public static String readFileToString(File file)
                       throws IOException

Lee el contenido de un archivo en una Cadena mediante la codificación predeterminada para la VM. El archivo está siempre cerrado.

Parámetros:

  • file - el archivo para lectura, no debe ser null

Devuelve:
el contenido del archivo, nunca null

Lanza: - IOException - en el caso de un error de e/S

Desde:
Commons IO 1.3.1

Edición por Oscar Reyes

He encontrado el código utilizado ( indirectamente ) por que de la clase:

IOUtils.java bajo Licencia Apache 2.0

public static long copyLarge(InputStream input, OutputStream output)
       throws IOException {
   byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
   long count = 0;
   int n = 0;
   while (-1 != (n = input.read(buffer))) {
       output.write(buffer, 0, n);
       count += n;
   }
   return count;
}

Muy similar a la que uso por Ritche_W

186voto

Pablo Grisafi Puntos 2674

Desde esta página la solución de:

 String text = new Scanner( new File("poem.txt") ).useDelimiter("\\A").next();

o

String text = new Scanner( new File("poem.txt"), "UTF-8" ).useDelimiter("\\A").next();

Si desea establecer el juego de caracteres

80voto

Dónal Puntos 61837

Si estás buscando una alternativa que no se trata de una 3ª parte de la biblioteca (por ej. commons IO), puede utilizar el Escáner de clase

private String readFile(String pathname) throws IOException {

    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int)file.length());
    Scanner scanner = new Scanner(file);
    String lineSeparator = System.getProperty("line.separator");

    try {
        while(scanner.hasNextLine()) {        
            fileContents.append(scanner.nextLine() + lineSeparator);
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}

72voto

finnw Puntos 24592

La guayaba tiene un método similar a la de Commons IOUtils que Willi aus Rohr mencionadas:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

// ...

String text = Files.toString(new File(path), Charsets.UTF_8);

EDICIÓN por Oscar Reyes

Este es el (simplificado) código subyacente en la citada biblioteca:

InputStream in = new FileInputStream(file);
byte[] b  = new byte[file.length()];
int len = b.length;
int total = 0;

while (total < len) {
  int result = in.read(b, total, len - total);
  if (result == -1) {
    break;
  }
  total += result;
}

return new String( b , Charsets.UTF_8 );

Editar (por Jonik): lo anterior no coincide con el código fuente de los últimos Guayaba versiones. Para la fuente actual, ver las clases de Archivos, CharStreams, ByteSource y CharSource en com.google.common.io paquete.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X