Dominando Java I/O: Archivos, Flujos y Fundamentos de Entrada/Salida
El paquete java.io contiene prácticamente todas las clases necesarias para realizar operaciones de entrada y salida (I/O) en Java. Todos los flujos representan una fuente de entrada y un destino de salida, y admiten datos como primitivos, objetos y caracteres localizados.
Concepto de Flujo (Stream)
Un flujo es una secuencia de datos. Existen dos tipos fundamentales:
- InputStream: Para leer datos desde una fuente.
- OutputStream: Para escribir datos hacia un destino.
Flujos de Bytes (Byte Streams)
Manejan datos de 8 bits. Las clases más usadas son FileInputStream y FileOutputStream.
Ejemplo: Copiar un archivo byte a byte
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
}
Flujos de Caracteres (Character Streams)
Manejan Unicode de 16 bits. Las clases principales son FileReader y FileWriter. Internamente usan flujos de bytes, pero leen/escriben dos bytes a la vez.
Ejemplo: Copiar archivo con caracteres Unicode
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
}
Flujos Estándar (Standard Streams)
Java proporciona tres flujos estándar, análogos a STDIN/STDOUT/STDERR de C/C++:
- System.in (Standard Input): Normalmente teclado.
- System.out (Standard Output): Normalmente pantalla.
- System.err (Standard Error): Para salida de errores, también pantalla.
Ejemplo: Leer consola hasta tecla 'q'
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Introduce caracteres, 'q' para salir.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while (c != 'q');
} finally {
if (cin != null) cin.close();
}
}
}
Lectura y Escritura de Archivos
Jerarquía principal de clases para I/O de archivos:
FileInputStream/FileOutputStream(bytes)FileReader/FileWriter(caracteres)
Métodos Clave de FileInputStream
| Método | Descripción |
|---|---|
read() | Lee un byte; retorna -1 al final |
read(byte[] b) | Lee bytes en array; retorna total leído |
available() | Bytes disponibles para leer |
close() | Cierra el flujo y libera recursos |
Métodos Clave de FileOutputStream
| Método | Descripción |
|---|---|
write(int b) | Escribe un byte |
write(byte[] b) | Escribe array de bytes |
close() | Cierra el flujo |
Ejemplo: Escribir y leer bytes
import java.io.*;
public class FileStreamTest {
public static void main(String args[]) {
try {
byte bWrite[] = {11, 21, 3, 40, 5};
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]);
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for (int i = 0; i < size; i++) {
System.out.print((char) is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Excepción: " + e.getMessage());
}
}
}
Navegación de Archivos y Directorios
Clases principales: File, FileReader, FileWriter.
Crear Directorios
mkdir(): Crea un directorio; retornatruesi éxito.mkdirs(): Crea directorio y todos sus padres.
Ejemplo
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
d.mkdirs(); // crea toda la jerarquía
}
}
Nota: Java resuelve automáticamente separadores de ruta (/ en Windows también funciona).
Listar Contenido de un Directorio
Ejemplo
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
try {
File file = new File("/tmp");
String[] paths = file.list();
for (String path : paths) {
System.out.println(path);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
- Dominando la entrada/salida en C: scanf() y printf() explicados
- Entrada/Salida de Archivos en Python: Dominando Operaciones de Lectura, Escritura y Gestión
- Variables y Literales en Java: Guía Completa
- Dominar Entrada y Salida en Java: Imprimir, Leer y Formatear Datos
- Clases y Objetos en Java: Guía Práctica
- Clases y métodos abstractos en Java: Guía completa
- Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
- Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
- Dominando Java Scanner: Guía Completa con Ejemplos Prácticos
- Dominando Autoboxing y Unboxing en Java: Ejemplos Prácticos y Mejores Prácticas
- Domina Java: Entendiendo Objetos, Clases y Conceptos Básicos de POO