Leer un archivo de texto plano en Java

Resuelto Tim the Enchanter asked hace 13 años • 31 respuestas

Parece que hay diferentes formas de leer y escribir datos de archivos en Java.

Quiero leer datos ASCII de un archivo. ¿Cuáles son las formas posibles y sus diferencias?

Tim the Enchanter avatar Jan 18 '11 01:01 Tim the Enchanter
Aceptado

Mi forma favorita de leer un archivo pequeño es usar BufferedReader y StringBuilder. Es muy simple y va al grano (aunque no es particularmente efectivo, pero es suficiente para la mayoría de los casos):

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
} finally {
    br.close();
}

Algunos han señalado que después de Java 7 deberías usar las funciones de prueba con recursos (es decir, cierre automático):

try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}

Cuando leo cadenas como esta, normalmente quiero hacer algo de manejo de cadenas por línea de todos modos, así que opto por esta implementación.

Aunque si realmente quiero leer un archivo en una cadena, siempre uso Apache Commons IO con el método de clase IOUtils.toString(). Puedes echar un vistazo a la fuente aquí:

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html

FileInputStream inputStream = new FileInputStream("foo.txt");
try {
    String everything = IOUtils.toString(inputStream);
} finally {
    inputStream.close();
}

Y aún más sencillo con Java 7:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {     
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}
Knubo avatar Jan 17 '2011 18:01 Knubo

ASCII es un archivo de TEXTO que se puede utilizar Readerspara leer. Java también admite la lectura de un archivo binario usando InputStreams. Si los archivos que se leen son enormes, entonces querrá usar a BufferedReaderencima de a FileReaderpara mejorar el rendimiento de lectura.

Lea este artículo sobre cómo utilizar unReader

También te recomiendo que descargues y leas este maravilloso (aunque gratuito) libro llamado Thinking In Java.

En Java 7 :

new String(Files.readAllBytes(...))

(docs) o

Files.readAllLines(...)

(docs)

En Java 8 :

Files.lines(..).forEach(...)

(docs)

Aravind Yarram avatar Jan 17 '2011 18:01 Aravind Yarram

La forma más sencilla es utilizar la Scannerclase en Java y el objeto FileReader. Ejemplo sencillo:

Scanner in = new Scanner(new FileReader("filename.txt"));

Scannertiene varios métodos para leer cadenas, números, etc... Puede buscar más información sobre esto en la página de documentación de Java.

Por ejemplo, leer todo el contenido en un String:

StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
    sb.append(in.next());
}
in.close();
outString = sb.toString();

Además, si necesita una codificación específica, puede usar esta en lugar de FileReader:

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)
Jesus Ramos avatar Jan 17 '2011 18:01 Jesus Ramos

Aquí hay una solución simple:

String content = new String(Files.readAllBytes(Paths.get("sample.txt")));

O para leer como lista:

List<String> content = Files.readAllLines(Paths.get("sample.txt"))
Nery Jr avatar Jan 29 '2015 16:01 Nery Jr