En este tema, aprenderemos sobre los flujos de archivos en Java, que son fundamentales para la lectura y escritura de datos en archivos. Los flujos de archivos permiten manejar la entrada y salida de datos de manera eficiente y son una parte esencial de la programación en Java.
Conceptos Clave
- Flujos de Entrada y Salida: Los flujos de entrada (Input Streams) se utilizan para leer datos de una fuente, mientras que los flujos de salida (Output Streams) se utilizan para escribir datos a un destino.
- Clases Principales:
FileInputStream
yFileOutputStream
: Para leer y escribir bytes desde y hacia archivos.BufferedInputStream
yBufferedOutputStream
: Para mejorar la eficiencia de lectura y escritura mediante el uso de un búfer.DataInputStream
yDataOutputStream
: Para leer y escribir datos primitivos de Java de manera portátil.ObjectInputStream
yObjectOutputStream
: Para leer y escribir objetos.
Flujos de Entrada y Salida de Bytes
FileInputStream y FileOutputStream
Estas clases se utilizan para leer y escribir bytes desde y hacia archivos.
Ejemplo de FileInputStream
import java.io.FileInputStream; import java.io.IOException; public class FileInputStreamExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("example.txt")) { int content; while ((content = fis.read()) != -1) { System.out.print((char) content); } } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
FileInputStream
se abre para leer el archivo "example.txt".- Se lee el contenido del archivo byte por byte hasta el final del archivo (
-1
). - Cada byte se convierte en un carácter y se imprime en la consola.
Ejemplo de FileOutputStream
import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamExample { public static void main(String[] args) { String data = "Hello, World!"; try (FileOutputStream fos = new FileOutputStream("example.txt")) { fos.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
FileOutputStream
se abre para escribir en el archivo "example.txt".- La cadena "Hello, World!" se convierte en un arreglo de bytes y se escribe en el archivo.
BufferedInputStream y BufferedOutputStream
Estas clases mejoran la eficiencia de lectura y escritura mediante el uso de un búfer.
Ejemplo de BufferedInputStream
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; public class BufferedInputStreamExample { public static void main(String[] args) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) { int content; while ((content = bis.read()) != -1) { System.out.print((char) content); } } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
BufferedInputStream
se utiliza para leer el archivo "example.txt" con un búfer.- La lectura se realiza de manera más eficiente que con
FileInputStream
solo.
Ejemplo de BufferedOutputStream
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStreamExample { public static void main(String[] args) { String data = "Hello, Buffered World!"; try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("example.txt"))) { bos.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
BufferedOutputStream
se utiliza para escribir en el archivo "example.txt" con un búfer.- La escritura se realiza de manera más eficiente que con
FileOutputStream
solo.
Flujos de Entrada y Salida de Datos Primitivos
DataInputStream y DataOutputStream
Estas clases se utilizan para leer y escribir datos primitivos de Java de manera portátil.
Ejemplo de DataOutputStream
import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class DataOutputStreamExample { public static void main(String[] args) { try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) { dos.writeInt(123); dos.writeDouble(45.67); dos.writeBoolean(true); } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
DataOutputStream
se utiliza para escribir datos primitivos en el archivo "data.bin".- Se escriben un entero, un doble y un booleano en el archivo.
Ejemplo de DataInputStream
import java.io.DataInputStream; import java.io.FileInputStream; import java.io.IOException; public class DataInputStreamExample { public static void main(String[] args) { try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) { int intValue = dis.readInt(); double doubleValue = dis.readDouble(); boolean booleanValue = dis.readBoolean(); System.out.println("Int: " + intValue); System.out.println("Double: " + doubleValue); System.out.println("Boolean: " + booleanValue); } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
DataInputStream
se utiliza para leer datos primitivos del archivo "data.bin".- Se leen un entero, un doble y un booleano del archivo y se imprimen en la consola.
Flujos de Entrada y Salida de Objetos
ObjectInputStream y ObjectOutputStream
Estas clases se utilizan para leer y escribir objetos.
Ejemplo de ObjectOutputStream
import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; class Person implements Serializable { private static final long serialVersionUID = 1L; String name; int age; Person(String name, int age) { this.name = name; this.age = age; } } public class ObjectOutputStreamExample { public static void main(String[] args) { Person person = new Person("John Doe", 30); try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(person); } catch (IOException e) { e.printStackTrace(); } } }
Explicación:
ObjectOutputStream
se utiliza para escribir un objetoPerson
en el archivo "person.ser".- La clase
Person
implementaSerializable
para permitir la serialización.
Ejemplo de ObjectInputStream
import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class ObjectInputStreamExample { public static void main(String[] args) { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person person = (Person) ois.readObject(); System.out.println("Name: " + person.name); System.out.println("Age: " + person.age); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
Explicación:
ObjectInputStream
se utiliza para leer un objetoPerson
del archivo "person.ser".- El objeto se deserializa y se imprimen sus atributos.
Ejercicios Prácticos
Ejercicio 1: Leer y Escribir un Archivo de Texto
Instrucciones:
- Escribe un programa que lea el contenido de un archivo de texto llamado "input.txt".
- Escribe el contenido leído en un nuevo archivo llamado "output.txt".
Solución:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopyExample { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("input.txt"); FileOutputStream fos = new FileOutputStream("output.txt")) { int content; while ((content = fis.read()) != -1) { fos.write(content); } } catch (IOException e) { e.printStackTrace(); } } }
Ejercicio 2: Serializar y Deserializar un Objeto
Instrucciones:
- Crea una clase
Student
que implementeSerializable
con atributosname
ygrade
. - Escribe un programa que serialice un objeto
Student
en un archivo llamado "student.ser". - Escribe otro programa que deserialice el objeto
Student
del archivo "student.ser" y muestre sus atributos.
Solución:
import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.Serializable; class Student implements Serializable { private static final long serialVersionUID = 1L; String name; int grade; Student(String name, int grade) { this.name = name; this.grade = grade; } } public class SerializeStudent { public static void main(String[] args) { Student student = new Student("Alice", 90); try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.ser"))) { oos.writeObject(student); } catch (IOException e) { e.printStackTrace(); } } } public class DeserializeStudent { public static void main(String[] args) { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.ser"))) { Student student = (Student) ois.readObject(); System.out.println("Name: " + student.name); System.out.println("Grade: " + student.grade); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
Conclusión
En esta sección, hemos aprendido sobre los flujos de archivos en Java, incluyendo cómo leer y escribir bytes, datos primitivos y objetos. Estos conceptos son fundamentales para manejar la entrada y salida de datos en aplicaciones Java. En la próxima sección, exploraremos el uso de BufferedReader
y BufferedWriter
para mejorar la eficiencia de la lectura y escritura de archivos de texto.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection