Cómo leer un archivo en Java

Descripción general

En este tutorial, exploraremos diferentes formas de leer un archivo en Java .

Primero, aprenderemos cómo cargar un archivo desde la ruta de clases, una URL o desde un archivo JAR usando clases estándar de Java.

En segundo lugar, veremos cómo para leer el contenido con BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream y FileChannel. También discutiremos cómo leer un archivo codificado en UTF-8.

Finalmente, exploraremos las nuevas técnicas para cargar y leer un archivo en Java 7 y Java 8.

Este artículo es parte de la serie «Java – Back to Basic» en Baeldung.

Para leer más:

Java – Crear un archivo

Cómo crear un archivo en Java usando JDK 6, JDK 7 con NIO o Commons IO.
Leer más →

Java – Escribir en archivo

Las muchas formas de escribir datos en un archivo usando Java.
Leer más →

Configuración

2.1 Archivo de entrada

En la mayoría de los ejemplos a lo largo de este artículo, «leeremos un archivo de texto con el nombre de archivo fileTest.txt que contiene una línea:

Para algunos ejemplos, usaremos un archivo diferente; en estos casos, mencionaremos el archivo y su contenido explícitamente.

2.2 Método auxiliar

Usaremos un conjunto de ejemplos de prueba con core Solo clases de Java, y en las pruebas, usaremos aserciones con comparadores Hamcrest.

Las pruebas compartirán un método readFromInputStream común que transforma un InputStream en String para facilitar la afirmación de los resultados:

Tenga en cuenta que hay otras formas de lograr este mismo resultado. Podemos consultar este artículo para conocer algunas alternativas.

Leer un archivo desde la ruta de clases

3.1 . Usando Java estándar

Esta sección explica cómo leer un archivo que está disponible en una ruta de clase. Leeremos el archivo «fileTest.txt» disponible en src / main / resources :

En el fragmento de código anterior, usamos la clase actual para cargar un archivo usando el método getResourceAsStream y pasamos la ruta absoluta del archivo a cargar.

El mismo método está disponible en una instancia de ClassLoader también:

Obtenemos el classLoa der de la clase actual usando getClass (). getClassLoader ().

La principal diferencia es que cuando se usa getResourceAsStream en una instancia de ClassLoader, la ruta se trata como absoluta comenzando desde la raíz de la ruta de clases.

Cuando se usa contra una instancia de Class, la ruta podría ser relativa al paquete, o una ruta absoluta, que está insinuada por la barra inclinada.

Por supuesto, tenga en cuenta que en la práctica , los flujos abiertos siempre deben estar cerrados, como InputStream en nuestro ejemplo:

3.2. Usando la biblioteca commons-io

Otra opción común es usar la clase FileUtils del paquete commons-io:

Aquí pasamos el objeto File al método readFileToString () de la clase FileUtils. Esta clase de utilidad logra cargar el contenido sin la necesidad de escribir ningún código repetitivo para crear una instancia de InputStream y leer datos.

La misma biblioteca también ofrece la clase IOUtils:

Aquí pasar el objeto FileInputStream al método toString () de la clase IOUtils. Esta clase de utilidad actúa de la misma manera que la anterior para crear una instancia InputStream y leer datos.

Lectura con BufferedReader

Ahora deje » s centrarse en diferentes formas de analizar el contenido de un archivo.

Empezaremos con una forma sencilla de leer un archivo utilizando BufferedReader:

Tenga en cuenta que readLine () devolverá null cuando se llega al final del archivo.

Lectura de un archivo usando Java NIO

En JDK7, el paquete NIO se actualizó significativamente.

Veamos un ejemplo usando la clase Files y el método readAllLines. El método readAllLines acepta una ruta.

La clase de ruta puede considerarse una actualización del archivo java.io.File con algunas operaciones adicionales implementadas.

5.1. Leyendo un archivo pequeño

El siguiente código muestra cómo leer un archivo pequeño usando la nueva clase Archivos:

Note que podemos usar readAllBytes () también si necesitamos datos binarios.

5.2. Leyendo un archivo grande

Si queremos leer un archivo grande con la clase Archivos, podemos usar BufferedReader.

El siguiente código lee el archivo usando la nueva clase Archivos y BufferedReader:

5.3. Leyendo un archivo usando Files.lines ()

JDK8 ofrece el método lines () dentro de la clase Files. Devuelve un flujo de elementos de cadena.

Veamos un ejemplo de cómo leer datos en bytes y decodificarlos usando el juego de caracteres UTF-8.

El siguiente código lee el archivo usando el nuevo Files.lines ():

Al usar Stream con canales IO como operaciones de archivo, necesitamos cerrar el stream explícitamente usando el método close ().

Como podemos ver, la API de archivos ofrece otra forma fácil de leer el contenido del archivo en una cadena.

En las siguientes secciones, veremos otros métodos menos comunes de leer un archivo que puede ser apropiado en algunas situaciones.

Leer con el escáner

A continuación, usemos un escáner para leer el archivo. Aquí usaremos espacios en blanco como delimitador:

Tenga en cuenta que el delimitador predeterminado es el espacio en blanco, pero se pueden usar varios delimitadores con un escáner.

La clase Escáner es útil al leer contenido de la consola, o cuando el contenido contiene valores primitivos, con un delimitador conocido (por ejemplo: una lista de números enteros separados por espacio).

Lectura con StreamTokenizer

Ahora vamos a leer un archivo de texto en tokens usando un StreamTokenizer.

El tokenizer funciona averiguando primero cuál es el siguiente token, String o número. Lo hacemos mirando el campo tokenizer.ttype.

Luego, leeremos el token real basado en este tipo:

  • tokenizer.nval – si el tipo era un número
  • tokenizer.sval – si el tipo era una Cadena

En este ejemplo, usaremos un archivo de entrada diferente que simplemente contiene:

El siguiente código lee del archivo tanto la cadena como el número:

Observe cómo se usa el token de final de archivo al final.

Este enfoque es útil para analizar un flujo de entrada en tokens.

Leyendo con DataInputStream

Podemos usar DataInputStream para leer binarios o tipos de datos primitivos de un archivo.

La siguiente prueba lee el archivo usando un DataInputStream:

Leyendo con FileChannel

Si están leyendo un archivo grande, FileChannel puede ser más rápido que IO estándar.

El siguiente código lee bytes de datos del archivo usando FileChannel y RandomAccessFile:

Lectura de un codificador UTF-8 ed Archivo

Ahora veamos cómo leer un archivo codificado en UTF-8 usando BufferedReader. En este ejemplo, leeremos un archivo que contiene caracteres chinos:

Lectura de contenido desde URL

Para leer contenido de una URL, usaremos «/» URL en nuestro ejemplo:

También hay formas alternativas de conectarse a una URL. Aquí usamos la URL y la clase URLConnection disponibles en el SDK estándar.

Lectura de un archivo desde un JAR

Para leer un archivo que se encuentra dentro de un Archivo JAR, necesitaremos un archivo JAR con un archivo dentro. Para nuestro ejemplo, leeremos «LICENSE.txt» del archivo «hamcrest-library-1.3.jar»:

Aquí queremos cargar LICENSE.txt que reside en la biblioteca Hamcrest, así que usaremos la clase Matcher que ayuda a obtener un recurso. El mismo archivo también se puede cargar usando el cargador de clases.

Conclusión

Como podemos ver, hay muchas posibilidades para cargar un archivo y leer datos de él usando Java simple.

Podemos cargar un archivo desde varias ubicaciones como classpath, URL o archivos jar.

Luego puede usar BufferedReader para leer línea por línea, Scanner para leer usando diferentes delimitadores, StreamTokenizer para leer un archivo en tokens, DataInputStream para leer datos binarios y tipos de datos primitivos, SequenceInput Stream para vincular varios archivos en un flujo, FileChannel para leer más rápido desde grandes archivos, etc.

Write a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *