Hasta ahora, las operaciones que utilizan programas Java se realizan en un indicador/terminal que no está almacenado en ningún lado. Pero en la industria del software, la mayoría de los programas están escritos para almacenar la información obtenida del programa. Una de estas formas es almacenar la información obtenida en un archivo .
¿Qué es el manejo de archivos en Java?
Un archivo es un contenedor que se utiliza para almacenar varios tipos de información. Los datos se almacenan permanentemente en la memoria secundaria mediante la creación de un archivo con un nombre único. Un archivo puede consistir en texto, imagen o cualquier otro documento.
Las diferentes operaciones que se pueden realizar sobre un archivo son:
- Creación de un nuevo archivo
- Abrir un archivo existente
- Lectura de archivo
- Escribir en un archivo
- Mover a una ubicación específica en un archivo
- Cerrar un archivo
Diferentes clases que se pueden usar en Java para el manejo de archivos:
- Flujo de entrada
- Salida de corriente
- FilterOutputStream
- FileOutputStream
- ByteArrayOutputStream
- ByteArrayInputStream
- FileInputStream
- FilterInputStream
- StringBufferInputStream
- SecuenciaEntradaFlujo
- BufferedOutputStream
- StringBufferInputStream
- Flujo de salida de datos
- flujo de impresión
- BufferedInputStream
- flujo de entrada de datos
- PushbackInputStream
En este artículo, aprenderemos cómo se utilizan Java ByteStreams para realizar la entrada y salida de 8 bits (1 byte) utilizando la clase RandomAccessFile , que consta del método writeBytes() y readBytes() para escribir y leer los datos en forma de bytes. .
Varios métodos utilizados para realizar la operación de archivo:
- writeBytes(String s): escribe la string en el archivo como una secuencia de bytes.
- readLine(): Lee la siguiente línea de texto de este archivo.
- getFilePointer(): Devuelve el desplazamiento actual en este archivo.
- length(): Devuelve la longitud de este archivo y el tipo de retorno es largo.
- close(): Cierra este flujo de archivo de acceso aleatorio y libera cualquier recurso del sistema asociado con el flujo.
- setLength(long newLength): Establece la longitud de este archivo.
- seek (posición larga): establece el desplazamiento del puntero del archivo, medido desde el comienzo de este archivo, en el que se produce la siguiente lectura o escritura.
Modos de apertura de archivos en Java:
Valor |
Sentido |
---|---|
«r» |
Abierto solo para lectura. La invocación de cualquiera de los métodos de escritura del objeto resultante provocará que se lance una IOException. |
«rw» |
Abierto a la lectura y la escritura. Si el archivo aún no existe, se intentará crearlo. |
«rws» |
Abierto para lectura y escritura, como con «rw», y también requiere que cada actualización del contenido o metadatos del archivo se escriba sincrónicamente en el dispositivo de almacenamiento subyacente. |
«rwd» |
Abierto para lectura y escritura, como con «rw», y también requiere que cada actualización del contenido del archivo se escriba sincrónicamente en el dispositivo de almacenamiento subyacente. |
Sintaxis de abrir archivo usando RandomAccessFile:
File file = new File( filename ) RandomAccessFile raf = new RandomAccessFile(file, mode)
Operaciones CRUD utilizando el manejo de archivos en Java
Ejemplo: Considere que desea mantener registros del número de contacto de su amigo en un archivo. Para distinguir entre el nombre de tu amigo y el número de contacto necesitas un separador. Para hacerlo, debe seleccionar un separador como ‘!’ o ‘$’ o algún símbolo especial que no aparece en el nombre de su amigo. Luego formaremos una string que constará de un nombre, un símbolo especial y un número para insertar en el archivo.
Sintaxis de un contacto en el archivo friendsContact.txt:
Name!Number
¿Cómo crear un archivo en Java?
Java
// Java program to create a file "friendsContact.txt" // and add a new contact in the file import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class AddFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; // Get the number to be updated // from the Command line argument long newNumber = Long.parseLong(data[1]); String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name // of contact already exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName || number == newNumber) { found = true; break; } } if (found == false) { // Enter the if block when a record // is not already present in the file. nameNumberString = newName + "!" + String.valueOf(newNumber); // writeBytes function to write a string // as a sequence of bytes. raf.writeBytes(nameNumberString); // To insert the next record in new line. raf.writeBytes(System.lineSeparator()); // Print the message System.out.println(" Friend added. "); // Closing the resources. raf.close(); } // The contact to be updated // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Producción:
Compilar y agregar el contacto en el archivo recién creado:
javac AddFriend.java java AddFriend abc 1111111111 Friend added java AddFriend pqr 1111111111 Input name or number already exist
Expediente:
¿Cómo leer un archivo en Java?
Java
// Java program to read from file "friendsContact.txt" // and display the contacts import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class DisplayFriends { public static void main(String data[]) { try { String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Traversing the file // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // Print the contact data System.out.println( "Friend Name: " + name + "\n" + "Contact Number: " + number + "\n"); } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Producción:
Compilando y leyendo los contactos del archivo:
javac DisplayFriends.java java DisplayFriends Friend Name: abc Contact Number: 1234567890 Friend Name: lmn Contact Number: 3333333333 Friend Name: xyz Contact Number: 4444444444
Expediente:
¿Cómo actualizar un archivo en Java?
Java
// Java program to update in the file "friendsContact.txt" // and change the number of an old contact import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class UpdateFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; // Get the number to be updated // from the Command line argument long newNumber = Long.parseLong(data[1]); String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name // of contact already exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName || number == newNumber) { found = true; break; } } // Update the contact if record exists. if (found == true) { // Creating a temporary file // with file pointer as tmpFile. File tmpFile = new File("temp.txt"); // Opening this temporary file // in ReadWrite Mode RandomAccessFile tmpraf = new RandomAccessFile(tmpFile, "rw"); // Set file pointer to start raf.seek(0); // Traversing the friendsContact.txt file while (raf.getFilePointer() < raf.length()) { // Reading the contact from the file nameNumberString = raf.readLine(); index = nameNumberString.indexOf('!'); name = nameNumberString.substring( 0, index); // Check if the fetched contact // is the one to be updated if (name.equals(inputName)) { // Update the number of this contact nameNumberString = name + "!" + String.valueOf(newNumber); } // Add this contact in the temporary // file tmpraf.writeBytes(nameNumberString); // Add the line separator in the // temporary file tmpraf.writeBytes( System.lineSeparator()); } // The contact has been updated now // So copy the updated content from // the temporary file to original file. // Set both files pointers to start raf.seek(0); tmpraf.seek(0); // Copy the contents from // the temporary file to original file. while (tmpraf.getFilePointer() < tmpraf.length()) { raf.writeBytes(tmpraf.readLine()); raf.writeBytes(System.lineSeparator()); } // Set the length of the original file // to that of temporary. raf.setLength(tmpraf.length()); // Closing the resources. tmpraf.close(); raf.close(); // Deleting the temporary file tmpFile.delete(); System.out.println(" Friend updated. "); } // The contact to be updated // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Producción:
Compilación y actualización del contacto en el archivo:
javac UpdateFriend.java java UpdateFriend abc 1234567890 Friend updated. java UpdateFriend tqr Input name does not exists.
Expediente:
¿Cómo eliminar un archivo en Java?
Java
// Java program to delete a contact // from the file "friendsContact.txt" import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class DeleteFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name of contact exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName) { found = true; break; } } // Delete the contact if record exists. if (found == true) { // Creating a temporary file // with file pointer as tmpFile. File tmpFile = new File("temp.txt"); // Opening this temporary file // in ReadWrite Mode RandomAccessFile tmpraf = new RandomAccessFile(tmpFile, "rw"); // Set file pointer to start raf.seek(0); // Traversing the friendsContact.txt file while (raf.getFilePointer() < raf.length()) { // Reading the contact from the file nameNumberString = raf.readLine(); index = nameNumberString.indexOf('!'); name = nameNumberString.substring( 0, index); // Check if the fetched contact // is the one to be deleted if (name.equals(inputName)) { // Skip inserting this contact // into the temporary file continue; } // Add this contact in the temporary // file tmpraf.writeBytes(nameNumberString); // Add the line separator in the // temporary file tmpraf.writeBytes( System.lineSeparator()); } // The contact has been deleted now // So copy the updated content from // the temporary file to original file. // Set both files pointers to start raf.seek(0); tmpraf.seek(0); // Copy the contents from // the temporary file to original file. while (tmpraf.getFilePointer() < tmpraf.length()) { raf.writeBytes(tmpraf.readLine()); raf.writeBytes(System.lineSeparator()); } // Set the length of the original file // to that of temporary. raf.setLength(tmpraf.length()); // Closing the resources. tmpraf.close(); raf.close(); // Deleting the temporary file tmpFile.delete(); System.out.println(" Friend deleted. "); } // The contact to be deleted // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } } }
Producción:
Compilación y eliminación del contacto en el archivo:
javac DeleteFriend.java java DeleteFriend pqr Friend deleted. java DeleteFriend tqr Input name does not exists.
Expediente:
Create
// Java program to create a file "friendsContact.txt" // and add a new contact in the file import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class AddFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; // Get the number to be updated // from the Command line argument long newNumber = Long.parseLong(data[1]); String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name // of contact already exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName || number == newNumber) { found = true; break; } } if (found == false) { // Enter the if block when a record // is not already present in the file. nameNumberString = newName + "!" + String.valueOf(newNumber); // writeBytes function to write a string // as a sequence of bytes. raf.writeBytes(nameNumberString); // To insert the next record in new line. raf.writeBytes(System.lineSeparator()); // Print the message System.out.println(" Friend added. "); // Closing the resources. raf.close(); } // The contact to be updated // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Read
// Java program to read from file "friendsContact.txt" // and display the contacts import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class DisplayFriends { public static void main(String data[]) { try { String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Traversing the file // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // Print the contact data System.out.println( "Friend Name: " + name + "\n" + "Contact Number: " + number + "\n"); } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Update
// Java program to update in the file "friendsContact.txt" // and change the number of an old contact import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class UpdateFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; // Get the number to be updated // from the Command line argument long newNumber = Long.parseLong(data[1]); String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name // of contact already exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName || number == newNumber) { found = true; break; } } // Update the contact if record exists. if (found == true) { // Creating a temporary file // with file pointer as tmpFile. File tmpFile = new File("temp.txt"); // Opening this temporary file // in ReadWrite Mode RandomAccessFile tmpraf = new RandomAccessFile(tmpFile, "rw"); // Set file pointer to start raf.seek(0); // Traversing the friendsContact.txt file while (raf.getFilePointer() < raf.length()) { // Reading the contact from the file nameNumberString = raf.readLine(); index = nameNumberString.indexOf('!'); name = nameNumberString.substring( 0, index); // Check if the fetched contact // is the one to be updated if (name.equals(inputName)) { // Update the number of this contact nameNumberString = name + "!" + String.valueOf(newNumber); } // Add this contact in the temporary // file tmpraf.writeBytes(nameNumberString); // Add the line separator in the // temporary file tmpraf.writeBytes( System.lineSeparator()); } // The contact has been updated now // So copy the updated content from // the temporary file to original file. // Set both files pointers to start raf.seek(0); tmpraf.seek(0); // Copy the contents from // the temporary file to original file. while (tmpraf.getFilePointer() < tmpraf.length()) { raf.writeBytes(tmpraf.readLine()); raf.writeBytes(System.lineSeparator()); } // Set the length of the original file // to that of temporary. raf.setLength(tmpraf.length()); // Closing the resources. tmpraf.close(); raf.close(); // Deleting the temporary file tmpFile.delete(); System.out.println(" Friend updated. "); } // The contact to be updated // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } catch (NumberFormatException nef) { System.out.println(nef); } } }
Delete
// Java program to delete a contact // from the file "friendsContact.txt" import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.NumberFormatException; class DeleteFriend { public static void main(String data[]) { try { // Get the name of the contact to be updated // from the Command line argument String newName = data[0]; String nameNumberString; String name; long number; int index; // Using file pointer creating the file. File file = new File("friendsContact.txt"); if (!file.exists()) { // Create a new file if not exists. file.createNewFile(); } // Opening file in reading and write mode. RandomAccessFile raf = new RandomAccessFile(file, "rw"); boolean found = false; // Checking whether the name of contact exists. // getFilePointer() give the current offset // value from start of the file. while (raf.getFilePointer() < raf.length()) { // reading line from the file. nameNumberString = raf.readLine(); // splitting the string to get name and // number String[] lineSplit = nameNumberString.split("!"); // separating name and number. name = lineSplit[0]; number = Long.parseLong(lineSplit[1]); // if condition to find existence of record. if (name == newName) { found = true; break; } } // Delete the contact if record exists. if (found == true) { // Creating a temporary file // with file pointer as tmpFile. File tmpFile = new File("temp.txt"); // Opening this temporary file // in ReadWrite Mode RandomAccessFile tmpraf = new RandomAccessFile(tmpFile, "rw"); // Set file pointer to start raf.seek(0); // Traversing the friendsContact.txt file while (raf.getFilePointer() < raf.length()) { // Reading the contact from the file nameNumberString = raf.readLine(); index = nameNumberString.indexOf('!'); name = nameNumberString.substring( 0, index); // Check if the fetched contact // is the one to be deleted if (name.equals(inputName)) { // Skip inserting this contact // into the temporary file continue; } // Add this contact in the temporary // file tmpraf.writeBytes(nameNumberString); // Add the line separator in the // temporary file tmpraf.writeBytes( System.lineSeparator()); } // The contact has been deleted now // So copy the updated content from // the temporary file to original file. // Set both files pointers to start raf.seek(0); tmpraf.seek(0); // Copy the contents from // the temporary file to original file. while (tmpraf.getFilePointer() < tmpraf.length()) { raf.writeBytes(tmpraf.readLine()); raf.writeBytes(System.lineSeparator()); } // Set the length of the original file // to that of temporary. raf.setLength(tmpraf.length()); // Closing the resources. tmpraf.close(); raf.close(); // Deleting the temporary file tmpFile.delete(); System.out.println(" Friend deleted. "); } // The contact to be deleted // could not be found else { // Closing the resources. raf.close(); // Print the message System.out.println(" Input name" + " does not exists. "); } } catch (IOException ioe) { System.out.println(ioe); } } }