Hoy le he ayudado a un amigo con su proyecto de Archivos en Java donde tenia que hacer un programa para el registro de películas, clientes y todo lo que se necesita para ir a rentar una película, saber que películas hay y quienes la rentaron.
Me paso lo que tenia hecho y la neta no le entendí mucho que digamos, para empezar tenia el registro de DVDS, Blu-Rays y Clientes en la misma pantalla lo que hacia que tuviera como 50 botones en una sola pantalla, no manches le dije, aparte tenia un Altas,bajas y listar para los 3 cuando podía juntar las dos primeras en uno solo. En fin, le dije que mejor le hacia la parte del registro de películas y dvds y ya que el validara e hiciera todo lo demás.
Y bueno, por si alguien esta aprendiendo a programar les dejo el código fuente de lo que hice al final.
Este programa contiene lo siguiente:
- Altas de Archivos(crear)
- Bajas de Archivos
- Leer Archivos
- Listar Archivos
- Renombrar Archivos
- Borrar Archivos.
Y así se ve la pantalla de las altas de películas en DVD o Blu-ray.
Bien, como lo prometido es deuda, después de instalar el plugin Wp-Syntax a mi blog, ahora si puedo poner código y que se vea bien chukis con colores y toda la onda ^^.
Empezamos, quiero suponer que si están viendo archivos es porque seguramente ya aprendieron a usar métodos y métodos con parámetros etc..¿No?. Bueno, por si no saben o nunca los han usado les explicare una parte con la que se toparan en cada evento de los botones.
En esta parte lo que hago es obtener el tipo que se selecciono del combo box para saber que se va dar de alta DVD(0) y Bluray(1). Los valores que recibo son posiciones del los datos del combo box, como cuando usamos vectores ya saben, empezando desde el 0.
switch(tipo.getSelectedIndex()) { case 0:altas(ruta="c:/archivoDVD.txt" ,presentacion="DVD"); break; case 1: altas(ruta="c:/archivoBlueray.txt" ,presentacion="Blueray"); break; default: JOptionPane.showMessageDialog(null,"No selecciono ninguna opción"); break; } |
Una ves que se selecciona el tipo de formato de la película entra al case y mando llamar al método altas donde le envió la ruta del archivo que va crear y el formato o presentación de la película. Si se dan cuenta a como esta el programa nunca entraran al case default, pero esta así porque falta la presentación VHS y no se que otra mas se necesitaba, de todas formas se harían prácticamente igual.
Ahora vemos el método altas donde recibimos 2 parámetros, la ruta donde se creara el archivo dependiendo del tipo de presentación de la película y el de presentación es solo para mostrar en un mensajito que se dio de alta un blu-ray o un DVD que igual se necesita.
public void altas(String ruta , String presentacion){ try{ PrintWriter datos = new PrintWriter(new FileWriter(ruta, true)); //escritura archivo String mensaje= codigo.getText() + "_" + titulo.getText() +"_"+ director.getText() +"_"+ actor1.getText() +"_"+ actor2.getText() +"_"+ lenguaje.getText() + "_"+ subtitulos.getSelectedIndex()+"\n"; JOptionPane.showMessageDialog(null,"Se dio de alta el "+presentacion+" con el código: "+codigo.getText()+"\n y el titulo: "+titulo.getText()); datos.write(mensaje); datos.close(); } catch(NumberFormatException nfe){ } catch(IOException ioe){ } /*ALTASsssssssss*/ } |
Lo siguiente es crear un archivo con PrintWriter en la ruta que le enviamos, después creamos una variable String llamada mensaje donde se guardaran todos los datos de la pelicula mediante un getText() a cada Textfield con información de la película y los voy separando con un guion bajo (_) para saber que es un campo distinto y al final una diagonal \n para separar 1 película de otra.
Una ves que se obtengan todos los registros y este llena la variable mensaje con todos los datos, procedemos a escribir en el archivo datos, para esto usamos write y le enviamos por parámetro la variable mensaje que contiene el registro de la película que estamos dando de alta así:
90210_nombre_director_actor1_actor2_lenguaje_subtitulos\n |
Y los guardamos con
datos.write(mensaje);
Y cerramos el archivo datos con un close una ves que dejemos de dar de alta datos.close();
Ahora, los siguientes 2 métodos los explicare antes del método bajas de registros porque se necesitaran dentro de el.
El primero se llama borrar_archivo y recibe como parámetro la ruta del archivo que se va borrar, creamos una variable del tipo File para indicarle que se trata de un archivo y este recibirá la ruta que obtenemos como parámetro, si lo encuentra se borra el archivo con delete() y si no, pues no 😛 y muestra un mensaje.
public void borrar_archivo(String ruta){ File arc = new File(ruta); if (arc.delete()) System.out.println("Archivo Borrado"); else System.out.println("No se pudo borrar"); } |
El siguiente método lo hice porque a la hora de utilizar el método bajas creo un archivo temporal en donde mando todos los datos del archivo y luego lo renombro para eliminar el tempo.txt y se quede con el nombre original con los datos correctos.
public void renombrar_archivo(String ruta){ File nuevonombre = new File(ruta); File viejonombre = new File("c:/tempo.txt"); if (viejonombre.renameTo(nuevonombre)){ System.out.println("No se pudo renombrar"); } |
Método baja, este método al igual que todos recibe como parámetro la ruta del archivo con el que vamos a trabajar, lo siguiente es crear una variable para saber cual es el registro que se va eliminar por su numero de código.
Para esto abrimos el archivo en modo lectura y leemos linea por linea mientras que las lineas no estén vacías, como el primer campo de nuestros registros es el codigo de la pelicula, creamos un StringTokenizer y le decimos que cuando se encuentre un guion bajo corte porque lo que sigue despues de ese guion es otro campo que no nos interesa, así que solo tomara la primera parte porque como les dije arriba, a la hora de guardar todos nuestros registros están así.
90210_nombre_director_actor1_actor2_lenguaje_subtitulos\n
Lo siguiente es comparar el codigo con el que vamos a eliminar con equals, que se usa para comparar si son iguales o no,si es igual mandamos un mensaje diciendo que se elimino el registro, pero si no son iguales guardamos toda la linea en un archivo temporal.
public void baja(String ruta){ String eliminar = JOptionPane.showInputDialog("Introduce el código de la película que deseas eliminar"); try { BufferedReader mensaje = new BufferedReader(new FileReader(ruta)); String linea = mensaje.readLine(); while(linea != null) { StringTokenizer token = new StringTokenizer(linea,"_"); String codigo = token.nextToken(); if(codigo.equals(eliminar)){ JOptionPane.showMessageDialog(null,"Se elimino el código: "+codigo); } else { String lineatempo=linea+"\n"; PrintWriter mensajeTemp = new PrintWriter(new FileWriter("c:/tempo.txt", true)); mensajeTemp.write(lineatempo); mensajeTemp.close(); } linea = mensaje.readLine(); } mensaje.close(); borrar_archivo(ruta); renombrar_archivo(ruta); } catch(NumberFormatException nfe){ }catch(IOException ioe){ } } |
Ya que guardamos todos los registros en el archivo temporal borramos el archivo original, por ejemplo: c:/archivoDVD.txt llamando al método borrar archivo. Y como los datos que nos importan los guardamos en el archivo temporal sin guardar el que eliminamos, lo renombramos con el método renombrar_archivo y le ponemos c:/archivoDVD.txt.
Y bueno, falta el método listar pero ese se los dejo de tarea xD, de todas formas viene dentro del código fuente que les dejare aquí abajo.
Descargar Código fuente y Archivo ejecutable en JAR para que vean como funciona ^^
Tal ves esta no fue la mejor forma de explicar el código que resulto en un post muy largo, así que cualquier duda en los comentarios.
Ojo!, le faltan muchísimas validaciones para que funcione 100%, pero esas les tocan a ustedes, el programa solo hace lo que tiene que hacer.
como dato curioso es blu-ray no blue ray le cambiaron el nombre por problemas de derechos de autor en algunos paises.
pd:esperare el codigo presionando F5
La verdad no sabía :P, gracias!.
Jaja eso quiere decir que tal ves ahorita estés por aquí :O
Hola…
te queria pedir una favor. lo que pasa es que ,me dejaron un trabajo similar al que realisaste, que por cierto, esta muy bueno, queria saber si podia ayudarme con el mio.. dandome una guia, ademas, dime como le hiciste para sacar el ejecutable de tu programa, pues no sabia que se podia hacer, porfavor ayudame.. te lo agradesco mucho. 😉
por si algo este es mi correo…
alejandro_8924@hotmail.com
Puedes mandarme la info a mi correo.
danielmd [at]soycachanilla.com
Hola, casi no uso el msn, si quieres puedes mostrarme de lo que trata tu proyecto y te puedo explicar que es lo que necesitas y te paso algunos temas para que te guies.
El ejecutable se puede sacar de varias formas, pero en este caso yo lo hice con Netbeans 6.5, Hay un boto que dice algo así como clean and build , tiene como un botón de Play como si lo estuvieras corriendo. Despues de eso se crea un archivo .jar en la carpeta de tu proyecto, debe estar en una carpeta llamada “dist”
tengo una duda..capaz q vos me podrias ayudar!
como hago para chequear si dos archivos son iguales en java??
gracias
saludos
@Matias:Uff pues las formas que se me ocurren seria que abrieras los dos archivos y fueras comparando linea por linea utilizando StringTokenizer utilizando un if que cuando encuentre una linea distinta te vote del ciclo y mandes decir que los archivos no son iguales.
Otra seria que abrieras los archivos los pases a bytes y compares como si fueran cadenas
if(archivo1.compareTo(archivo2)==0){
//son iguales
}
Aqui te dejo un ejemplo de como pasar un archivo a bytes
http://code.google.com/p/festival-de-postres/source/browse/trunk/Festival%20de%20postres%20UN%20-%20Servicios/src/org/festivaldepostresun/servicios/FileToByte.java?r=70
me podrias ayudar con el codigo para abrir los dos archivos y fuera comparando linea por linea utilizando StringTokenizer utilizando un if que cuando encuentre una linea distinta te vote del ciclo y mandes decir que los archivos no son iguales.
lo intento hacer pero no funciona…seria muy importante si me ayudaras..te agradesco
utiliza algo parecido al método baja () que hice, solo que no darás de baja, lo que puedes hacer es abrir los dos archivos como se muestra en ese método y luego alfo así
boolean bandera=false;
while(linea != null && bandera=false)
{
StringTokenizer token = new StringTokenizer(linea,”_”);
String codigo = token.nextToken();
StringTokenizer token = new StringTokenizer(linea,”_”);
String codigo2 = token.nextToken();
if(!codigo.equals(codigo2)){
bandera=true;
}
}
No es la mejor opción pero es la mas rápida y fácil de explicar, pero OJO, este método puede tardar mucho si lo usas con archivos muy pesados.
Y si puedes pon tu código para verlo.
haha me equivoke, espero que entiendas la idea, debes abrir los dos archivos y leerlos, el while queda igual asi como lo puse.
bueno q te parece este metodo …creo q anda muy bien
public static boolean igualArchivo(FileReader archivo1, FileReader archivo2) {
try {
BufferedReader br1 = new BufferedReader(archivo1);
BufferedReader br2 = new BufferedReader(archivo2);
String linea1 = null;
String linea2 = null;
while ((linea1 = br1.readLine()) != null) {
linea2 = br2.readLine();
if (!linea1.equals(linea2)) {
return false;
}
}
linea2 = br2.readLine();
if (linea2 != null) {
return false;
}
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
Funciona?
while ((linea1 = br1.readLine()) != null) {
linea2 = br2.readLine();
if (linea1.equals(linea2))
return true; // Son iguales
else
{return false; break; //Son diferentes y te saca.
}
hola soy nuevo en esto de la programacion y mi primer proyecto es hacer un menu que me pida ingresar un contacto y en el guardar clave_nombre_telefono_direccion y correo ya tengo el menu y creo que ya tengo la otra parte donde me pide que escriba los datos pero lo hice en dos partes y no se como unirlas y ps esa es mi pregunta como puedo hacerlo ,,,, gracias ,,,
}/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package arreglo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* @author usuario
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args)throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader leerBR = new BufferedReader(isr);
int x = 1;
String[] arreglo = new String[5];
int contador = 0;
do{
System.out.println(“————MENU—————“);
System.out.println(“1. AGREGAR CONTACTO”);
System.out.println(“2. BUSCAR CONTACTO”);
System.out.println(“3. SALIR”);
System.out.println(“——————————–“);
int opcion = Integer.parseInt(leerBR.readLine());
switch(opcion){
case 1: System.out.println(“INGRESA LOS DATOS A GUARDAR”);
arreglo[contador] = leerBR.readLine();
contador++;
break;
case 2: System.out.println(“NUMERO DEL 0 AL 5 PARA DESPLEGAR CONTACTO”);
int indice = Integer.parseInt(leerBR.readLine());
System.out.println(“El nombre es: ” + arreglo[indice]);
break;
case 3: x = 2;
break;
}
}while(x==1);
}
}
run:
————MENU—————
1. AGREGAR CONTACTO
2. BUSCAR CONTACTO
3. SALIR
——————————–
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author usuario
*/
public class Token {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader leerBR = new BufferedReader(isr);
System.out.println(“Escribe LOS DATOS separado con guion bajo de acuerdo a lo siguiente CLAVE # DEL 0 AL 4, NOMBRE, DIRECCION, TELEFONO Y CORREO “);
String texto = leerBR.readLine();
StringTokenizer token = new StringTokenizer(texto, “_”);
System.out.println(“LOS DATOS SON: ” + token.countTokens());
while(token.hasMoreTokens()){
System.out.println(“clave: ” + token.nextToken());
System.out.println(“nombre: ” + token.nextToken());
System.out.println(“direccion: ” + token.nextToken());
System.out.println(“telefono: ” + token.nextToken());
System.out.println(“correo: ” + token.nextToken());
}
}
}
run:
Escribe LOS DATOS separado con guion bajo de acuerdo a lo siguiente CLAVE # DEL 0 AL 4, NOMBRE, DIRECCION, TELEFONO Y CORREO
Tienes que crear un main donde llames a las otras clases que creaste para que no los tengas repetidos, asi nomas creas obejetos de esa clase y mandas llamar sus metodos.
Mira, hice el main y en el main mande llamar tu primer programa creando un objeto de la clase capturar donde mande llamar al metodo capturardatos.
Fijate en esto —–>capturar opcion1= new capturar();
y en esto —> opcion1.capturardatos();
Con eso llamo a tu primer programa, te recuerdo que son dos archivos y si quieres meter el otro programa tendrás un tercero
menu.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.*;
public class menu {
public static void main(String[] args)throws IOException{
int n=0;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader leerBR = new BufferedReader(isr);
capturar opcion1= new capturar();
do{
System.out.println(“<<<<<<<<<< M E N U >>>>>>>>>” +
“\n1.Altas” +
“\n2.Consulta” +
“\n3.Salir” +
“\n Elige una opcion”);
n = Integer.parseInt(leerBR.readLine());
switch(n)
{
case 1: System.out.println(“Opcion 1”);
opcion1.capturardatos();
break;
case 2: System.out.println(“Opcion 2”);
break;
case 3: System.out.println(“Adios!”);
break;
default: System.out.println(“Esta opcion no existe”);
}
}while(n!=3);
}
}
capturar.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class capturar {
public void capturardatos()throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader leerBR = new BufferedReader(isr);
int x = 0;
String[] arreglo = new String[5];
int contador = 0;
do{
System.out.println(“————MENU—————”);
System.out.println(“1. AGREGAR CONTACTO”);
System.out.println(“2. BUSCAR CONTACTO”);
System.out.println(“3. SALIR”);
System.out.println(“——————————–”);
int opcion = Integer.parseInt(leerBR.readLine());
switch(opcion){
case 1: System.out.println(“INGRESA LOS DATOS A GUARDAR”);
arreglo[contador] = leerBR.readLine();
contador++;
break;
case 2: System.out.println(“NUMERO DEL 0 AL 5 PARA DESPLEGAR CONTACTO”);
int indice = Integer.parseInt(leerBR.readLine());
System.out.println(“El nombre es: ” + arreglo[indice]);
break;
case 3: x = 2;
break;
default: System.out.print(“Esta opcion no existe”);
}
}while(x!=3);
}
}
Sale!, espero te sea útil.
hola…como puedes modificar un dato ingresado?
y otra cosa..si kieres rescatar por ejemplo el nombre del director de una pelicula ..como se hace?
saludos
Puedes hacer una busqueda como esta en las bajas de este programa y cuando encuentre el dato que quieras modificar haz que te devuelva la posición donde se encuentran los datos.
Por ejemplo : Película Arma mortal esta en el renglón 3, ahora para modificar le cambias el nombre y reemplazas el contenido del renglón 3 por lo nuevo.
Otra forma seria eliminar el renglón que quieras modificar con el método baja y lo vuelves a dar de alta en el archivo, pero en la misma opcion de modificar, no se si se entienda.
Con respecto a lo ultimo, abres el archivo en modo lectura y con un SET muestras los datos
director.setText();
Get es para guardar y Set para mostrar lo guardado.
Esta muy bueno el tema men te felicito, ya le hecho un ojo al codigo q hiciste porque justamente horita estoy aprendiendo a trabajar con archivos, debi aprenderlo hace un año pero no me lo enseñaron y ahora lo necesito…..cualquier duda preparate porque te preguntare jeje. gracias por el tema
tu no lo descargates de casualidad me lo enviarias por fa para revisarlo
rawy@live.com.mx
Ola, oigan alguien ya hizo el metodo de listar? creo q no entiendo muy bien
Si descargas el código ahí viene.
Mmmm… vi el codigo y todo, pero arr no entiendo tmpoco eso del listado… como lo implementas… :S
Hola Glenda, que parte no entiendes?
El programa lee linea por linea, y en cada linea se encuentran todos los datos separados por un TOKEN, este toquen esta definido por un guion bajo, es decir, cuando el programa encuentre un guion bajo, sera lo que indique que se trata de otro dato.
Con token.nextToken(); va avanzando de uno a al siguiente dato y los va guardando en una variable, es como cuando utilizas vectores y vas recorriendo una posición.
mmm, ok creo k mas k menos ya le entendi jeje, pero… o sea xk dices k ese d linea no esta pero si esta en tu programa?
es k bueno ya lo corri segun yo, aparece bn, pero no da bajas… oh no se… k estoy haciendo mal :(?
public void altas(String ruta , String presentacion){
try{
PrintWriter datos = new PrintWriter(new FileWriter(ruta, true));
//escritura archivo
String mensaje= codigo.getText() + “_” +
titulo.getText() +”_”+
director.getText() +”_”+
actor1.getText() +”_”+
actor2.getText() +”_”+
lenguaje.getText() + “_”+
subtitulos.getSelectedIndex()+”\n”;
JOptionPane.showMessageDialog(null,”Se dio de alta el “+presentacion+” con el codigo: “+codigo.getText()+”\n y el titulo: “+titulo.getText());
datos.write(mensaje);
datos.close();
} catch(NumberFormatException nfe){
} catch(IOException ioe){ }
/*ALTASsssssssss*/
}
bueno jeje espero no molestarte :s
MMMmm, no espera, creo k ya vi ejeje, mi archivo no estaba en la ruta k se marcaba, ahora…
creo k ya, aunk, el listado… no se actualiza vdd? como puedo hacer para actualizarlo?
es k necesito borrarlo para k salgan los datos cierto?
bueno jeje d nvo gracias :)!
Pues imprimes el listado una ves que se borren los datos con un setText en el área de impresión o mandas llamar nuevamente el método de impresión como yo le hice.
Cual linea glenda?
Recuerda que en las bajas debe tener la misma ruta del archivo C:/datos.txt, algo así.
Lo que hace el programa, como yo lo hice, es buscar el código que se quiere eliminar, luego envía todos los datos a un archivo temporal, sin contar el que se elimina, por ultimo se vuelven a pasar todos los datos al archivo original y se elimina el temporal.
como le hago para hacer esto mismo pero sin graficos, o si no como puedo guardar o escribir varios datos en un archivo como nombre titulo actor etc en el caso de una pelicula
Hola alex, si quieres hacerlo sin gráficos supongo que lo estarás haciendo desde consola, entonces solo cambia los campos input y cámbialos por
Captura = new BufferedReader(new InputStreamReader(System.in));
Imprimir =Captura.readLine(); System.out.println(Imprimir);
Hola.
Sin muchos rodeos: no entendi como hacerlo no gráfico.
Hola Osuna, lo único que es diferente es la forma en que se capturan y guardan los datos, los métodos son los mismos.
Te recomiendo que leas este ejercicio, con el vas a aprender a capturar desde consola con InputStreamBuffer e imprimir datos con System.out.println.
http://www.adrformacion.com/udsimg/java/3/img030003.gif
pero, mm, no seria mucho cambiar, bno, es k se crean muchos botones y cosas asi, oh eso no importa?
bno es k yo a penas estoy aprendiendo a usar graficos jeje, y se me ha vuelto dificil… luego por ejemplo tengo una duda lo d brackground para cambiar la ventana k creaste… como se haria o k :s
Daniel gracias por tus respues y tu ayuda.
Por cierto está bien chido tu blog, es más ya me animaste a empezar el mio.
oye no puedo decasgar el codigo …. ayudame por favor me urge
podrias poner otro link para la descarga, ya que el anterior no es valido 🙁
Si sirve el link que esta puesto, pero de todas formas lo volví a subir a esta otra web para que lo descarguen.
DESCARGAR CÓDIGO
Saludos!
Hola Daniel, quisiera que me ayudes diciendome si es posible crear en java un fichero que guarde un registro de alumnos con sus nombres, notas(8 notas) , promedios de notas(3 promedios parciales y un promedio general), y bueno, cosas asi, eso lo puedo hacer hasta cierto punto, el detalle es que al guardar la informacion, esta no se borre, sobre todo si apago el computador, dime, ¿es posible hacer ese programa?, como se puede hacer algo asi? que se guarde un archivo y no se borre su contenido al apagar mi computador y quew al volver a prenderlo y ejecutarlo, la informacion siga ahi. Agradecere tu ayuda. Mi correo es mcafee_85_04@hotmail.com
Se hace exactamente igual que el programa que puse arriba, solo agregas los campos correspondientes a cada parcial, haces una suma y los divides entre los parciales, asi obtienes el resultado del promedio general y lo guardas en otra variable.
Si lo haces con archivos como el que explico, los datos no se borran de tu computadora a menos que borres el archivo, pero si ejecutas el programa siempre estarán ahí los datos.
Saludos!
muy bueno lo que hiciste dany, estoy aprendiendo esto de las altas, bajas y modificación y creo que lo tuyo me puede servir de orientación, saludos!
Oye muy buen post, yo precisamente estaba creando una interfaz donde doy de alta, de baja y muestro la lista de usuarios registrados, nunca se me hubiera ocurrido crear un archivo temporal para el metodo de bajas y tambien podria servir para el de modificar datos, conrazon cuando queria modificar algun dato veia el archivo y no habia nada, solo el registro “modificado”, muy bien sigue asi
holaaaa
Hola!
me podrias ayudar en mi proyecto sobre archivos en java..si confirmas la ayuda para q te envie mi abance xfa…
De que se trata?
Podrías poner otro link para poder descargar el archivo?
Gracias!
no sirve el link 🙁 lo podrías volver a subir por favor
Link muerto, descanse en paz jaja, no ya enserio, ¿podrías resubirlo? por faaaaaaaaaaaaaaaaaaa
hole podrias recargar el linck de descarga esque ya no existe gracias
Hace muco que cambie de computadora, lo siento.
Igual los puedo ayudar contestando sus preguntas, pues el código ya esta en esta entrada (sin gui).
Cual es la probabilidad de que sigas contestando?:(
hola, bueno, mi problema es que al querer borrar el archivo original, no lo hace y lo intente hacer manualmente pero me sale el sig mensaje “la acción no se puede complementar porque Java(TM) Plataform SE binary tiene abierto el archivo”, pero he cerrado todos los elementos del archivo. ¿Podrías ayudarme a saber por qué es mi problema?:(
Te dejo el codigo por aqui:
package FlujosyArchivos;
import java.io.*;
import FlujosyArchivos.Registro;
public class Archivo
{
private static Registro reg;
public static BufferedReader br;
private static PrintWriter pw;
private static File ArchivoE, ArchivoL;
public static void AbrirArchivo(String NomArchivo, boolean Escritura) throws IOException {
if(Escritura){
ArchivoE=new File(NomArchivo);
pw=new PrintWriter(new FileWriter(ArchivoE, true));
}
else{
ArchivoL=new File(NomArchivo);
br=new BufferedReader(new FileReader(ArchivoL));
}
}
public static void CerrarArchivo() throws IOException {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
}
public static void ImprimeArchivo() throws IOException
{
AbrirArchivo(“Agenda.txt”, false);
String Linea=br.readLine();
while(Linea!=null){
System.out.println(Linea);
Linea=br.readLine();
}
CerrarArchivo();
}
public static void EliminaRegistro(String Nom) throws IOException
{
AbrirArchivo(“Agenda.txt”, false);
AbrirArchivo(“Tmp.txt”,true);
String Linea=br.readLine();
while(Linea !=null)
{
if(!Nom.equals(Linea.substring(0, Linea.indexOf(“|”))))
pw.println(Linea);
Linea=br.readLine();
}
CerrarArchivo();
CerrarArchivo();
ArchivoL.deleteOnExit();
ArchivoE.renameTo(new File(“Agenda.txt”));
}
public static void ModificaRegistro(String Nom) throws IOException{
AbrirArchivo(“Agenda.txt”, false);
AbrirArchivo(“Tmp.txt”, true);
String Linea=br.readLine();
while(Linea!=null)
{
if(Nom.equals(Linea.substring(0, Linea.indexOf(“|”))))
pw.println(reg.getNombre() + “|” + reg.getNumero() + “|” + reg.getDireccion());
else
pw.println(Linea);
Linea=br.readLine();
}
ArchivoL.deleteOnExit();
ArchivoE.renameTo(new File(“Agenda.txt”));
CerrarArchivo();
}
private static Registro Str2Reg(String linea){
reg = new Registro();
int pipe1 = linea.indexOf(‘|’);
int pipe2 = linea.indexOf(‘|’, pipe1 + 1);
reg.setNombre(linea.substring(0, pipe1));
reg.setNumero(linea.substring(pipe1+1, pipe2));
reg.setDireccion(linea.substring(pipe2+1));
return reg;
}
public static Registro LeeRegistro(String nom) throws IOException
{
AbrirArchivo(“Agenda.txt”,false);
String linea= br.readLine();
while (linea != null){
if(nom.equals(linea.substring(0, linea.indexOf(‘|’)))){
reg = Str2Reg(linea);
CerrarArchivo();
return reg;
}
linea = br.readLine();
}
CerrarArchivo();
return null;
}
public static void GrabaRegistro(Registro reg) throws IOException {
pw.println(reg.getNombre() + “|” + reg.getNumero() + “|” + reg.getDireccion());
pw.close();
}
}
No se si ya resolviste tu duda, pero si ya la resolviste fue porque no estas cerrando los archivos bien con el CerrarArchivo();, verdad?
Perdón por contestar tan tarde, no había visto que me habían dejado código por aquí XD
No sé si sigas respondiendo, espero que sí.
Debo hacer para final de semestre un sistema de registro sobre cualquier cosa, mi idea era hacerlo de un local de renta de videojuegos, la verdad veo este ejemplo muy completo e interesante, si no te molesta me gustaría usarlo de guía. Pero veo que el link está caído, ¿crees que puedas resubirlo por favor? De verdad siento que me servirá mucho, tengo ciertos problemas con la parte de renombrar los archivos y el listado.
Espero puedas responder pronto
¿Podrías resubir el link?
En serio, siento que tu ejemplo me servirá de mucho, ojalá puedas responder
Ya no tengo el código con la interfaz, lo que hay aquí es lo único que tengo y es lo que necesitan para hacer sus proyectos con archivos, las funciones estan ahí, tan solo tienen que armar la interfaz e ir metiendo las funciones y modificarlas para lo que necesitan.
Si pegan código pueden utilizar https://pastebin.com/ y colocan el link que les genera para poder revisar alguno de sus problemas, pero planteen el problema.