Leer un archivo de texto plano en Java
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?
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
}
ASCII es un archivo de TEXTO que se puede utilizar Readers
para 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 BufferedReader
encima de a FileReader
para 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)
La forma más sencilla es utilizar la Scanner
clase en Java y el objeto FileReader. Ejemplo sencillo:
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
tiene 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)
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"))