Está en la página 1de 21

Universidad Nacional Facultad de Ingeniería

de Trujillo Programa de Estudios: Ingeniería de Sistemas

PROGRAMACIÓN
ORIENTADA A OBJETOS II
Ms. Zoraida Yanet VIDAL MELGAREJO
zvidal@unitru.edu.pe

Sesión 01
ARCHIVOS EN JAVA:
CLASE FILE Y
ARCHIVOS DE
ACCESO
SECUENCIAL

2
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 1 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Definición de archivo

• Un archivo o fichero es una colección de datos


que se almacena en un soporte físico (por
ejemplo un disco duro o una memoria USB) para
poderlos manipular en cualquier momento.

• Estos datos se almacenan como una colección de registros, conteniendo todos ellos,
generalmente, los mismos campos.

• Cada campo almacena un valor de un tipo predefinido o definido por el usuario. El


registro más simple estaría formado por un carácter. Cada campo almacenará el dato
correspondiente. El conjunto de campos forma un registro, y el conjunto de todos los
registros forman un archivo.

-3-

Definición de archivo
Para manipular un archivo son tres las operaciones que se realizan: abrir el archivo,
escribir o leer registros del archivo y cerrar el archivo. Por ejemplo, si se quisiera
almacenar en un archivo los datos relativos a una persona, podría diseñarse cada
registro con los datos: nombre, apellidos y fecha de nacimiento.

Desde un punto de vista gráfico, puede representarse la estructura de un archivo


de la siguiente manera:

campo
registro registro

archivo

-4-

4
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 2 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Definición de archivo

En Programación Orientada a Objetos, se empleará el término


de objetos más que de registros, y de sus atributos más que de
campos.

Se pueden agrupar los archivos en dos tipos: archivos de la


aplicación (son los archivos: .java, .class, etc., que conforman
la aplicación) y los archivos de datos (son los que proveen de
datos a la aplicación). Java ofrece dos tipos diferentes de
acceso a los archivos de datos: secuencial y aleatorio.

Para dar soporte al trabajo con archivos, la biblioteca de Java


proporciona varias clases de entrada/salida (E/S) que
permiten leer y escribir datos a, y desde, archivos y
dispositivos.

-5-

La clase File

La clase File sirve Un objeto de la clase File Sus métodos permitirán interrogar
para encapsular la representa el nombre de un al sistema sobre todas las
interacción de los archivo o de una carpeta (o características de ese archivo o
programas con el directorio) que puede existir carpeta, tal como el tamaño del
sistema de archivos. en el sistema de archivos de la archivo, su tipo, su fecha de
computadora. creación, los permisos de acceso
que tenemos sobre él, etc.

-6-

6
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 3 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

La clase File

Premio Nobel de Literatura


• Además la clase File es la única forma que tenemos de trabajar con carpetas (crearlas,
ver los archivos que contienen, cambiar el nombre o borrar los archivos, etc.).

• Que exista un objeto de tipo File no implica que exista el archivo (o directorio)
correspondiente en el sistema de archivos.

• Una instancia de la clase File es la representación abstracta de una ruta de acceso


para un archivo o una carpeta.

-7-

Constructores de la clase File

Constructores public File (String ruta_completa)

Permiten instanciar objetos de tipo Crea un objeto File a partir del nombre
File. del archivo, más su ruta de acceso
(relativa o absoluta).

public File (String ruta, String nombre) public File (File ruta, String nombre)

Crea un objeto File a partir de una ruta Crea un objeto File a partir de otro que
(relativa o absoluta) y un nombre de represente una ruta (relativa o absoluta)
archivo separado. y un nombre de archivo separado.

-8-

8
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 4 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

La clase File

Premio
• El constructor utilizado depende a menudo de otros Nobel
objetos de Literatura
File necesarios para el
acceso.

• Por ejemplo, si sólo se utiliza un archivo en la aplicación, el primer constructor es el


mejor. Si, en cambio, se utilizan varios archivos desde un mismo directorio, el segundo o
tercer constructor será más cómodo. En caso de que el directorio o archivo sean
variables, el tercer constructor será el más indicado de los tres.

• Una vez creado un objeto File, ya se puede reunir información sobre al archivo a través
de los métodos que la clase File proporciona.

-9-

Métodos de la clase File

String getName() String getAbsolutePath()


֍ ֍
Retorna el nombre del archivo Retorna la ruta absoluta del archivo

String getParent() boolean canRead()


֍ ֍
Retorna la ruta del directorio que Retorna verdadero si puede ser leído
lo contiene

String getPath() boolean canWrite()


֍ ֍
Retorna la ruta relativa del archivo Retorna verdadero si no está marcado
como sólo lectura

- 10 -

10
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 5 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Métodos de la clase File

boolean exists() long length()


֍ ֍
Retorna verdadero si existe en el Devuelve el tamaño del archivo (en
sistema de archivos bytes).

boolean isDirectory() boolean createTempFile()


֍ ֍
Retorna verdadero si es un Crea un archivo vacío en la carpeta
directorio. temporal del sistema

boolean isHidden() boolean delete()


֍ ֍
Retorna verdadero si es un Elimina un archivo o un directorio vacío
archivo o carpeta oculto

- 11 -

11

Métodos de la clase File

String[] list() boolean renameTo(File dest)


֍ ֍
Lista los nombres de los archivos y Permite renombrar un archivo
carpetas que hay en la carpeta
especificada por el objeto File
boolean mkdir() boolean setReadOnly()
֍ ֍
Crea un directorio Marca un archivo como sólo lectura

boolean mkdirs() String toString()


֍ ֍
Crea un conjunto de directorios Devuelve la ruta especificada cuando
se creó el objeto File

- 12 -

12
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 6 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Los streams o flujos

01
Java define la
entrada/salida en
términos de streams
o flujos de
02
La comunicación
información. Es
decir, cualquier
programa realizado
entre un programa y
el origen o destino de 03
cierta información, se De esta forma, el

04
en Java que
realiza mediante un programa leerá o
necesite llevar a
stream que no es más escribirá en el
cabo una
que un objeto que stream sin
operación de E/S lo Un stream es una
importarle desde
hará a través de un hace de secuencia
dónde viene la
stream. intermediario entre el ordenada de datos.
información o
programa y el origen adónde va.
o destino de la
información.
- 13 -

13

Los streams o flujos


El programa lee datos

Archivo stream read Programa

El programa escribe datos

Programa write stream Archivo

Este nivel de abstracción hace que un programa no tenga que saber nada del
dispositivo, lo que se traduce en una facilidad más a la hora de escribir programas, ya
que los algoritmos para leer y escribir datos serán siempre más o menos los mismos:

Leer: Escribir:
Abrir un flujo desde un archivo. Abrir un flujo hacia un archivo.
Mientras haya información: Mientras haya información:
Leer datos. Escribir datos.
Cerrar el flujo. Cerrar el flujo.
- 14 -

14
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 7 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Los streams o flujos

La biblioteca estándar de Java, en su paquete java.io, define una colección que


clases que soportan los algoritmos para leer y escribir.

Object

InputStream Reader

SubClases SubClases

OutputStream Writer

SubClases SubClases

- 15 -

15

Flujos para acceso secuencial de archivos

El tipo de acceso más simple a un archivo de datos es el secuencial.

Un archivo abierto para acceso secuencial es un archivo que puede


almacenar registros de cualquier longitud, incluso de un solo byte.

Cuando la información se escribe registro a registro, éstos son colocados uno


a continuación de otro, y cuando se lee, se empieza por el primer registro y
se continúa al siguiente hasta alcanzar el final.
Este tipo de acceso generalmente se utiliza con archivos de texto en los que
se escribe toda la información desde el principio hasta el final y se lee de la
misma forma.

- 16 -

16
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 8 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Flujos para acceso secuencial de archivos

Sin embargo, los archivos de texto no son los más apropiados para
almacenar grandes series de números, porque cada número es
almacenado como una secuencia de bytes.

Esto significa que un número entero de nueve dígitos ocupa nueve bytes en
lugar de los cuatro requeridos para un entero.

Java proporciona clases para trabajar con distintos flujos: de bytes y de


caracteres para el tratamiento de texto, y de datos para el tratamiento de
números.

Java también proporciona clases para trabajar con flujos de objetos.

- 17 -

17

Flujos para acceso


secuencial de
archivos. 1 Flujo de Bytes:

FileOutputStream: escribe bytes


FileInputStream: lee bytes

Flujo de Caracteres 2

FileWriter: escribe caracteres


FileReader: lee caracteres
3 Flujo de Datos:

DataOutputStream: escribe datos de


tipo primitivo
Flujo de Objetos: 4 DataInputStream: lee datos de tipo
primitivo.
ObjectOutputStream: escribe objetos
ObjectInputStream: lee objetos
- 18 -

18
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 9 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Byte streams (Flujos de bytes)

✓ Su uso está orientado a la lectura y escritura de datos


binarios.

✓ El tratamiento del flujo de bytes viene gobernado por dos


clases abstractas: InputStream y OutputStream.

✓ Cada una de estas clases abstractas tienen varias


subclases concretas que controlan las diferencias entre
distintos dispositivos de I/O que se pueden utilizar.

✓ Así mismo, estas dos clases son las que definen los métodos
que sus subclases tendrán implementados y, de entre todas,
destacan los métodos read() y write() que leen y escriben
bytes de datos respectivamente.

- 19 -

19

Byte streams (Flujos de bytes)

FileInputStream FileOutputStream

Permite leer bytes desde un archivo. Permite escribir bytes en un archivo.

- 20 -

20
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 10 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Byte stream: FileOutputStream

Permite escribir bytes a un archivo.


Además de los métodos que
hereda de la clase OutputStream, la
clase proporciona los siguientes
constructores:
▪ FileOutputStream (String nombre)
▪ FileOutputStream (String nombre,
boolean añadir)
▪ FileOutputStream (File archivo)

El primer constructor abre un flujo de salida hacia el archivo especificado por nombre, el
segundo hace lo mismo pero con la posibilidad de añadir datos a un fichero existente
(añadir = true), y el tercero lo hace a partir de un objeto File.

- 21 -

21

Byte stream: FileInputStream

Permite leer bytes desde un


archivo. Además de los métodos
que hereda de la clase
InputStream, la clase
proporciona los siguientes
constructores:
• FileInputStream (String nombre)
• FileInputStream (File archivo)

El primer constructor abre un flujo de entrada desde el archivo especificado por nombre, y el
segundo lo hace a partir de un objeto File.

- 22 -

22
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 11 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Character streams (Flujos de caracteres)

✓ Proporciona un medio conveniente para el manejo de


entradas y salidas de caracteres.

✓ Al utilizar la codificación Unicode, se puede internacionalizar

✓ El tratamiento del flujo de caracteres viene gobernado por


dos clases abstractas: Reader y Writer.

✓ Cada una de estas clases abstractas tienen varias subclases


concretas que implementan los métodos definidos en ellas
siendo los más destacados los métodos read() y write() que
leen y escriben caracteres de datos respectivamente.

- 23 -

23

Character streams (Flujos de caracteres)

FileReader FileWriter

Permite leer caracteres desde un Permite escribir caracteres en un


archivo. archivo.

- 24 -

24
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 12 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Character stream: FileWriter

Permite escribir caracteres (char) a


un archivo. Además de los
métodos que hereda de la clase
Writer, la clase proporciona los
siguientes constructores:
• FileWriter (String nombre)
• FileWriter (String nombre,
boolean añadir)
• FileWriter (File archivo)

El primer constructor abre un flujo de


salida hacia el archivo especificado por
nombre, el segundo hace lo mismo con
la posibilidad de añadir datos y el
tercero lo hace a partir de un objeto File.
- 25 -

25

Character stream: FileReader

Permite leer caracteres desde un


archivo. Además de los métodos
que hereda de la clase Reader, la
clase proporciona los siguientes
constructores:
• FileReader (String nombre)
• FileReader (File archivo)

El primer constructor abre un flujo de


entrada desde el archivo especificado
por nombre, y el segundo lo hace a
partir de un objeto File.

- 26 -

26
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 13 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Data streams (Flujos de datos)

✓ Permiten leer y escribir datos de tipos primitivos desde y


hacia un archivo.

✓ El paquete java.io proporciona las clases DataInputStream y


DataOutputStream, que permiten leer y escribir,
respectivamente, datos de cualquier tipo primitivo.

✓ Derivan de las clases abstractas InputStream y


OutputStream.

✓ Sin embargo, no pueden utilizarse con los dispositivos ASCII


de E/S estándar: un flujo DataInputStream sólo puede leer
datos almacenados en un archivo mediante un flujo
DataOutputStream.

- 27 -

27

Data streams (Flujos de datos)

DataInputStream DataOutputStream

Permite leer datos de tipos primitivos Permite escribir datos de tipos


desde un archivo. primitivos en un archivo.

- 28 -

28
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 14 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Data streams (Flujos de datos)

DataOutputStream

Programa write filtro flujo Archivo

DataInputStream

Programa filtro flujo read Archivo

- 29 -

29

Data stream: DataOutputStream

Deriva indirectamente de OutputStream y


permite escribir en un flujo de salida
subordinado, datos de cualquier tipo
primitivo.
Todos los métodos proporcionados por
esta clase están definidos en la interfaz
DataOutput implementada por la misma.
Las siguientes líneas de código definen un
filtro que permitirá escribir datos de tipos
primitivos en un archivo datos.txt.
FileOutputStream flujo = new
FileOutputStream(“datos.txt”);
DataOutputStream filtro = new
DataOutputStream(flujo);

- 30 -

30
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 15 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Data stream: DataOutputStream

writeBoolean() writeChar()
֍ ֍
Escribe un valor de tipo boolean. Escribe un valor de tipo char.

writeByte() writeChars()
֍ ֍
Escribe un valor de tipo byte. Escribe un String como una secuencia
de caracteres.

writeBytes() writeShort()
֍ ֍
Escribe un String como una Escribe un valor de tipo short.
secuencia de bytes.

- 31 -

31

Data stream: DataOutputStream

writeInt() writeDouble()
֍ ֍
Escribe un valor de tipo int. Escribe un valor de tipo double.

writeLong() writeUTF()
֍ ֍
Escribe un valor de tipo long. Escribe una cadena de caracteres en
formato UTF-8.

writeFloat() Los dos primeros bytes especifican el


֍ ֍ número de bytes de datos que serán
Escribe un valor de tipo float. escritos.

- 32 -

32
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 16 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Data stream: DataInputStream

Deriva indirectamente de InputStream y


permite leer de un flujo de entrada
subordinado, datos de cualquier tipo
primitivo escritos por un flujo de la clase
DataOutputStream.
Todos los métodos proporcionados por esta
clase están definidos en la interfaz
DataInput implementada por la misma.
Las siguientes líneas de código definen un
filtro que permitirá leer datos de tipos
primitivos desde el archivo datos.txt.
FileInputStream flujo = new
FileInputStream(“datos.txt”);
DataInputStream filtro = new
DataInputStream(flujo);

- 33 -

33

Data stream: DataInputStream

readBoolean() readShort()
֍ ֍
Devuelve un valor de tipo Devuelve un valor de tipo short.
boolean.

readByte() readInt()
֍ ֍
Devuelve un valor de tipo byte. Devuelve un valor de tipo int.

readChar() readLong()
֍ ֍
Devuelve un valor de tipo char. Devuelve un valor de tipo long.

- 34 -

34
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 17 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Data stream: DataInputStream

֍ ֍ ֍ ֍

readFloat() readDouble() readUTF()


Devuelve un valor de Devuelve un valor de Devuelve una cadena de caracteres en formato
tipo float. tipo double. UTF-8. Los dos primeros bytes especifican el número de
bytes de datos que serán leídos.

- 35 -

35

Object streams (Flujos de objetos)

✓ Permiten leer y escribir objetos desde y hacia un archivo.

✓ El paquete java.io proporciona las clases ObjectInputStream


y ObjectOutputStream, que permiten leer y escribir objetos,
respectivamente.

✓ Derivan de las clases abstractas InputStream y


OutputStream.

✓ Para poder escribir o leer objetos, es necesario que las


clases, a partir de las cuales estos objetos serán creados,
implementen la interfaz Serializable.

- 36 -

36
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 18 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Object streams (Flujos de objetos)

ObjectInputStream ObjectOutputStream

Permite leer objetos desde un Permite escribir objetos en un


archivo. archivo.

- 37 -

37

Object streams (Flujos de objetos)

Para que un objeto pueda ser


almacenado en disco, es necesario
que la clase a la que pertenece sea
serializable. Esta característica la
poseen todas aquellas clases que
implementen la interfaz
java.io.Serializable.

La interfaz Serializable no contiene


ningún método, basta con que una
clase la implemente para que sus
objetos puedan ser serializados por la
maquina virtual y por lo tanto
almacenarlos en disco.

- 38 -

38
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 19 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Object streams (Flujos de objetos)

Normalmente la operación de enviar Ambas clases dan lugar a flujos que


una serie de objetos a un archivo en procesan sus datos; en este caso se
disco para hacerlos persistentes trata de convertir el estado de un
recibe el nombre de seriación, y la objeto (los atributos excepto las
operación de leer y recuperar su variables estáticas), incluyendo la
estado del archivo para clase del objeto y el prototipo de la
reconstruirlos en memoria recibe el misma, en una secuencia de bytes y
nombre de deseriación. viceversa. Por esta razón los flujos
Para realizar estas operaciones de ObjectOutputStream y
una forma automática, el paquete ObjectInputStream deben ser
java.io proporciona las clases construidos sobre otros flujos que
ObjectOutputStream y canalicen esos bytes a y desde el
ObjectInputStream. archivo.

- 39 -

39

Object streams (Flujos de objetos)

El esquema gráfico que responde a este proceso se muestra a continuación:

Programa

seriar deseriar

flujo flujo
Objetos
ObjectOutputStream ObjectInputStream

flujo flujo
FileOutputStream Archivo en el disco FileInputStream

- 40 -

40
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 20 -
Universidad Nacional Facultad de Ingeniería
de Trujillo Programa de Estudios: Ingeniería de Sistemas

Object stream: ObjectOutputStream

Deriva indirectamente de
OutputStream y permite escribir objetos
en un flujo de salida subordinado.
La escritura de objetos en disco se
realiza a través del
ObjectOutputStream. Para crear un
objeto de esta clase es necesario
disponer del FileOutputStream
asociado al archivo donde se va a
realizar la escritura.
Una vez creado el objeto, la clase
dispone del método
writeObject(Object obj) para realizar la
escritura del objeto en el disco.

- 41 -

41

Object stream: ObjectInputStream

Deriva indirectamente de InputStream


y permite leer objetos de un flujo de
salida subordinado.
Para leer los objetos de un archivo que
han sido almacenados mediante
ObjectOutputStream, se deberá utilizar
un objeto ObjectInputStream.
La clase ObjectInputStream dispone de
un método readObject() para devolver
los objetos almacenados en el archivo.
El constructor de esta clase requiere un
objeto FileInputStream asociado al
archivo de donde se leerá el objeto.

- 42 -

42
Experiencia Curricular: POO II Tema: Archivos de acceso secuencial
Docente: Ms. Zoraida Yanet Vidal Melgarejo Página - 21 -

También podría gustarte