Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A
Tema 6. Lectura y escritura de la información
¿Qué aprenderás?
• Utilizar los Stream y Buffers para leer y escribir información desde periférico.
• Crear, eliminar y renombrar archivos.
• Modificar el contenido de un archivo de texto.
• Crear carpetas y modificar su contenido.
¿Sabías que…?
Para trabajar con archivos es imprescindible utilizar estructuras de datos que permitan
almacenar distintos valores. Anteriormente ya vimos para tal fin las estructuras Arrays.
A continuación haremos un repaso de las Arrays a modo de recordatorio.
Un Array es una estructura que permite almacenar un número fijo de distintos valores de
un mismo tipo. El número de valores que contiene una Array será su “longitud” y no es un
valor alterable.
A cada valor le asociaremos un identificador numérico empezando por 0.
Un array se puede representar gráficamente como un conjunto de celdas, cada una con su
valor y su dirección. El siguiente ejemplo representa una Array que almacena 4 nombres:
0 1 2 3
Podemos declarar una variable del tipo Array con la sintaxis: TipoDato[] nombreVariable;
Por ejemplo, vamos a crear una Array para contener Strings:
String[] miPrimerArrayDeStrings;
Una vez declarada la variable la inicializamos indicándole el número de elementos que
contendrá con la sintaxis: nombreVariable = new TipoDato[ longitudArray ];
Por ejemplo, vamos a indicar que el array pueda contener 5 strings:
miPrimerArrayDeStrings = new String [5];
Podemos combinar los dos ejemplos anterior en una única línea:
String[] miPrimerArrayDeStrings = new String[5] ;
Los valores que contiene un array serán inicializados cuando le indiquemos su longitud con
un valor que dependerá del tipo de variable:
• variables numéricas con un 0
• objetos a null
• variables booleanas a false
• variables del tipo char a ‘\u0000’).
2
Informática. Programación I
Tema 6. Lectura y escritura de la información
0 1
3
Informática. Programación I
Tema 6. Lectura y escritura de la información
}
}
}
Cuando recorramos un array podemos utilizar también una estructura for loop para
recorrer un array. En ésta estructura definiremos una variable que irá obteniendo los
distintos valores de un array.
La sintaxis es: for( TipoDatoArray variable : arrayQueRecorremos){ … }
Ahora que hemos visto como recorrer un array para mostrar su información, vamos a ver
cómo puede el usuario establecer la longitud del array y rellenarla mediante un bucle.
4
Informática. Programación I
Tema 6. Lectura y escritura de la información
Cuando queramos pasar una Array como parámetro tendremos que indicar que el tipo de
parámetro que va a recibir una función va a ser del tipo array. Para ello utilizaremos la
sintaxis:
public static tipoRetorno nombreFuncion( tipoValorArray[] nombreArray){ …. }
Cuando queramos indicar que una función va a retornar una Array que contendrá un cierto
tipo de valores utilizaremos la sintaxis:
public static tipoValorArray[] nombreFuncion() { …..}
Hasta ahora cada vez que hemos ejecutado un programa éste se ha ejecutado desde cero.
Pero si quisiéremos poder ejecutar un programa recuperando los valores de la última vez
que se ha ejecutado necesitaríamos almacenar estos valores en estructuras de datos
persistentes como un fichero o una base de datos.
Un fichero o archivo es una secuencia de bytes almacenada en la memoria persistente de
la computadora e identificada y gestionada por un sistema de ficheros formando una
entidad lógica.
Cada fichero tiene asociado un nombre que ha de ser único dentro del directorio en el que
se crea. Eso convierte la ruta hacia el directorio en el identificador inequívoco del fichero.
El tamaño y contenido de un fichero puede variar en cualquier momento. El sistema de
ficheros del sistema operativo será el encargado de controlar en todo momento quien
tiene acceso al fichero evitando que dos programas lo puedan modificar en el mismo
instante. Cada vez que queramos modificar o leer un fichero tendremos que pedir permiso
al sistema de ficheros.
5
Informática. Programación I
Tema 6. Lectura y escritura de la información
En función de cómo queramos acceder a un fichero para leer o modificarlo vamos a poder
diferenciar dos métodos de acceso:
• Acceso secuencial: accedemos a los valores contenidos en el fichero como si fuera
un archivo de texto, empezando por la primera palabra hasta que encontremos el
valor que queremos y decidamos detener la lectura. Es un método cuya rapidez
dependerá de lo pronto o tarde que encuentre la información.
• Acceso directo: accedemos directamente a la posición del contenido que quiero
modificar. Éste acceso es más rápido pero implica conocer exactamente la posición
en donde quiero leer/modificar un dato.
Para trabajar con ficheros utilizaremos variables del tipo File. Estas variables nos van a
permitir gestionar toda la información relativa a ficheros y carpetas a partir de la ruta de
acceso al archivo o carpeta. Las funciones de File relativas al tratamiento de carpetas no
funcionarán si la variable hace referencia a un archivo y evidentemente las funciones
relativas al tratamiento de archivos no funcionarán si la variable File hace referencia a una
carpeta.
Para crear una nueva variable del tipo File utilizaremos la sintaxis:
File nombreVariableFile = new File (“ruta al archivo o carpeta”);
Para utilizar alguna de sus funciones asociadas utilizaremos la sintaxis:
nombreVariableFile.nombreFuncion();
Algunas de las funciones más importantes que va a tener una variable File son:
• .isDirectory(); Retorna true o false según la variable haga referencia a un
directorio o no.
• .isFile(); Retorna true o false según la variable haga referencia a un archivo o no.
• .exists(); retorna true o false según haga referencia a un archivo o directorio que
exista o no.
• .canRead(); retorna true o false según tengamos o no permisos de lectura.
• .canWrite(); retorna true o false según tengamos o no permisos de escritura.
• .length(); retorna un valor long con la longitud del archivo.
6
Informática. Programación I
Tema 6. Lectura y escritura de la información
Java clasifica la escritura y lectura de datos entre aquellas operaciones que se dan entre las
propias variables del programa y aquellas operaciones con elementos externos al
programa, los que llamaremos periféricos. Un periférico va a poder ser el teclado, la
pantalla, un fichero, una impresora, un scanner etc… y siempre que trabajemos leyendo o
escribiendo datos contra un periférico utilizaremos dos grandes grupos de variables: los
Streams y los Buffers.
Cuando creemos una variable del tipo Stream le vamos a tener que vincular un periférico.
A través de esta variable podremos escribir o leer bytes con el periférico.
Como nosotros no estamos acostumbrados a trabajar con bytes, a cada Stream que
creemos le asociaremos un Buffer que nos permitirá comunicarnos con el Stream a través
de Strings en vez de bytes.
Ya veremos que de variables tipo Stream y Buffer encontraremos un gran variedad
dependiendo del tipo de periférico con el que queramos conectar, del tipo de acceso y si
vamos a realizar operaciones de lectura y escritura.
7
Informática. Programación I
Tema 6. Lectura y escritura de la información
Por cierto, la gran mayoría de variables del tipo Stream y Buffers las encontraremos en el
package: java.io . El nombre java.io hace referencia a operaciones de Input/Output
(lectura/Escritura). Así que deberemos importar la librería con: import java.io.*;
• BufferedWriter: como variable del tipo Buffer a la que escribiremos Strings para
que se los pase a FileWriter. Al crear la variable le vincularemos el stream
FileWritter con la sintaxis:
BufferedWriter variableBuffer = new BufferedWriter(variableFileWriter);
Una vez creadas las variables necesarias utilizaremos las funciones de la variableBuffer
para escribir, vaciar y cerrar la comunicación con el fichero. La sintaxis será la siguiente:
• variableBuffer.write(“texto a escribir”); : para escribir un texto en el fichero.
• variableBuffer.flush(); : para escribir todo aquello que pudiera haber quedado
pendiente en el buffer y vaciarlo.
• variableBuffer.close(); : para finalizar la comunicación con el fichero.
8
Informática. Programación I
Tema 6. Lectura y escritura de la información
import java.io.*;
Diagrama que representa los elementos necesarios para escribir en un archivo secuencialmente
¡Atención! Cada vez que abramos el archivo para escribir en él se borrarán todos los datos
contenidos. Si queremos añadir contenido tendremos que leer el contenido, guardarlo en
una String, modificar la String y escribirla como el contenido del nuevo archivo.
9
Informática. Programación I
Tema 6. Lectura y escritura de la información
Una vez creadas las variables necesarias utilizaremos las funciones de la variableBuffer
para leer una línea y cuando queramos cerrar la comunicación con el archivo. La sintaxis
será la siguiente:
• variableBuffer.readLine(); : para leer una línea del archivo (hasta encontrar un salo
de línea).
• variableBuffer.close(); : para finalizar la comunicación con el archivo.
import java.io.*;
Diagrama que representa los elementos necesarios para leer los valores de un archivo secuencialmente
¡Atención! Cada vez que ejecutemos br.readLine() obtendremos una string con el siguiente
contenido almacenado en el archivo hasta encontrar un salto de línea. Si mi archivo
contiene 3 líneas cada vez que ejecute br.readLine() me retornará una línea, la cuarta vez
me retornará un null porque ya no hay más texto dentro del archivo.
Teniendo presente que obtendremos un null cuando ya no queden más datos en un
archivo, podemos crear un bucle para mostrar todo el contenido de un archivo ejecutando
en cada iteración un br.readLine() hasta obtener null;
El siguiente ejemplo muestra una posible solución para mostrar todo el contenido de un
array utilizando un bucle for.
11
Informática. Programación I
Tema 6. Lectura y escritura de la información
Como Java es un lenguaje que puede funcionar en distintos sistemas operativos tenemos
que diseñar nuestros programas para que funcionen independientemente de la plataforma
en la que se ejecuten. Al trabajar con archivos tendremos que tener presente que cada
sistema operativo puede tener un sistema de archivos muy distinto, con separadores de
carpeta y unidades propias.
Vamos a ver ahora algunos aspectos que tenemos que tener presente para garantizar la
interoperabilidad de nuestro programa.
Cada sistema operativo va a poder utilizar un carácter para separar las carpetas al
especificar una ruta. Así por ejemplo en Windows la ruta a un archivo ubicado en la
carpeta ejemplo podría ser: ejemplo\nombreArchivo.txt. Mientras en Unix sería:
ejemplo/nombrArchivo.txt.
Para conocer qué carácter utiliza el sistema operativo que ejecuta mi programa para
separar las carpetas en una ruta utilizaremos la propiedad separator de File.
La siguiente línea guarda en separador el carácter utilizado para separar carpetas:
String separador = File.separator
12
Informática. Programación I
Tema 6. Lectura y escritura de la información
En el siguiente ejemplo podemos ver cómo utilizar correctamente los valores del sistema
para trabajar con archivos:
Vídeo: Trabajar_con_archivos: Modificación y lectura de un archivo utilizando los valores del sistema
13
Informática. Programación I
Tema 6. Lectura y escritura de la información
Hasta ahora hemos visto como acceder a ficheros de forma secuencial. Al acceder
directamente a un fichero su contenido va a ser tratado como un array de chars al que
tendremos asociado una variable del tipo RandomAccessFile que contendrá una variable
apuntando a una posición de ese array. Cada vez que queramos leer o escribir en el
archivo deberemos apuntar a una posición en concreto y luego o bien leer o escribir un
carácter.
Cuando nos refiramos al “puntero” de RandomAccessFile nos estaremos refiriendo a esa
variable que va a apuntar a una dirección en concreto.
Las principales funciones que RandomAccessFile nos ofrece para trabajar con archivos son
las siguientes:
• .seek(numero); sitúa el puntero en la posición indicada por el número. La primera
posición es la 0.
• .readByte(); retorna el byte en el que se ha situado el puntero.
• .writeBytes(“texto”); se sustituyen los bytes siguientes a la posición en donde esté el
punto por cada carácter del texto pasado como String. Automáticamente se
incrementa la longitud del archivo si es necesario.
• .readLine(); avanza el puntero hasta el primer salto de línea o fin de fichero y retorna
una string con todos los caracteres leídos.
• .length(); retorna la longitud del fichero.
• .getFilePointer(); retorna la posición actual del puntero.
14
Informática. Programación I
Tema 6. Lectura y escritura de la información
15
Informática. Programación I
Tema 6. Lectura y escritura de la información
Recursos y enlaces
• File, documentación oficial:
https://docs.oracle.com/javase/10/docs/api/java/io/File.html
16
Informática. Programación I
Tema 6. Lectura y escritura de la información
Conceptos clave
• i/o: input / output hace referencia a los periféricos de entrada y salida de datos.
• Periférico de entrada o salida: dispositivos asociados con un ordenador que ofrecen o
muestran algún tipo de datos
• File: tipo de variable que permite gestionar información sobre carpetas y documentos.
• Acceso directo: acceso a una información conociendo su posición de memoria
• Acceso secuencial: acceso a una información leyendo toda la memoria hasta encontrar
el dato buscado
17
Informática. Programación I
Tema 6. Lectura y escritura de la información
¿Qué tipo de variable nos permite gestionar información sobre una carpeta?
a) Directory
b) Buffer
c) System
d) File
¿Qué función nos permite situar el puntero en una posición de un archivo con un acceso
directo?
a) .go()
b) .point()
c) .seek()
d) .read()
Ponlo en práctica
Actividad 1
Crea un programa que pida tres frases distintas al usuario, las guarde en un archivo de
nombre “ejemplo.txt”. Finalmente ha de leer y mostrar por consola el contenido de
“ejemplo.txt”.
18
Informática. Programación I
Tema 6. Lectura y escritura de la información
SOLUCIONARIOS
¿Qué tipo de variable nos permite gestionar información sobre una carpeta?
a) Directory
b) Buffer
c) System
d) File
¿Qué función nos permite situar el puntero en una posición de un archivo con un acceso
directo?
i) .go()
j) .point()
k) .seek()
l) .read()
19
Informática. Programación I
Tema 6. Lectura y escritura de la información
Ponlo en práctica
Actividad 1
Crea un programa que pida tres frases distintas al usuario, las guarde en un archivo de
nombre “ejemplo.txt”. Finalmente ha de leer y mostrar por consola el contenido de
“ejemplo.txt”.
Solución:
import java.io.*;
System.out.println("Escribe la 1a línea");
textoIntroducido = br.readLine(); //leemos valor por teclado
bwFile.write(textoIntroducido + saltoLinea); //guarda los datos en el buffer con un
salto de linea
System.out.println("Escribe la 2a línea");
textoIntroducido = br.readLine();
bwFile.write(textoIntroducido + saltoLinea);
20
Informática. Programación I
Tema 6. Lectura y escritura de la información
System.out.println("Escribe la 3a línea");
textoIntroducido = br.readLine();
bwFile.write(textoIntroducido + saltoLinea);
//leemos el archivo
FileReader fr = new FileReader(document); //Stream conectado al fichero a leer.
BufferedReader brFile = new BufferedReader(fr); //Buffer que almacena datos del
stream
for (String linea = brFile.readLine(); linea != null; linea = brFile.readLine()) {
System.out.println(linea); //mostramos por consola el texto leído
}
brFile.close(); //cerramos el buffer
}
}
21