Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Salida archivos.

Hola ;)

Estoy trabajando con lectura y salida de archivos. Y me surgió un problema ya que no encuentro la manera de imprimir varios archivos de una sola entrada.

Por ejemplo, deseo crear un programa que me lea por entrada de teclado los puntos cardinales y me cree un archivo Norte.dat, Sur.dat, Este.dat y Oeste.dat.

Para lectura de archivos utilizo:
FileInputStream entrada = new FileInputStream("ArchivoGeneral.dat");
ObjectInputStream ois = new ObjectInputStream(entrada);
ois.readObject();

Y para la salida:

FileOutputStream sortida = new FileOutputStream("DESEOIMPRIMIR.dat");
ObjectOutputStream oos = new ObjectOutputStream(sortida);

for (int i = 1; i < 4; i++) {
oos.writeObject();
}

Aquí me surge el problema. Cómo podría hacer que me cree 4 archivos con diferentes nombres (Norte.dat, Sur.dat etc) teniendo los puntos cardinales en un enumerado?Si no existiese esta posibilidad es recomendable crear métodos diferentes para cada punto cardinal?

Gracias y perdonen las molestias

marzo 31, 2014 | Registered Commenteradsadadaadsasdasddasads

Podrías usar algo similar a ésto:


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public enum PuntosCardinales {

NORTE {
@Override
public void guardar(Object write) {
guardarArchivo(write, NORTE.toString());
}

},
SUR {
@Override
public void guardar(Object write) {
guardarArchivo(write, SUR.toString());
}
},
ESTE {
@Override
public void guardar(Object write) {
guardarArchivo(write, ESTE.toString());
}
},
OESTE {
@Override
public void guardar(Object write) {
guardarArchivo(write, OESTE.toString());
}
};

public abstract void guardar(Object write);

private static void guardarArchivo(Object write, String nombre) {
FileOutputStream sortida = null;
try {
sortida = new FileOutputStream(nombre + ".dat");
ObjectOutputStream oos = new ObjectOutputStream(sortida);
oos.writeObject(write);
} catch (IOException ex) {
// manejo de la excepción
} finally {
try {
if (sortida != null) {
sortida.close();
}
} catch (IOException ex) {
// manejo de la excepción
}
}
}
}

marzo 31, 2014 | Registered Commenterchoces

Fantástico !.

Partiré de tu idea e intentaré ahora clasificar los datos de teclado a cada archivo correspondiente.

Muchas gracias de verdad ;)

Perdón por revivir el post, pero alguien me podría ayudar a encontrar el error del siguiente método:

public void mostrarDatos() {
try {
Persona a = (Persona) f.readObject();
while (!(a.Centinela())) {
a = (Persona) f.readObject();
System.out.println(a);
}

} catch (IOException ex) {
Logger.getLogger(FitxerJugadorsIn.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(FitxerJugadorsIn.class.getName()).log(Level.SEVERE, null, ex);
}

Lo que me está haciendo es imprimir todo el valor de a A partir de el dato número 2 sustituyendo el Dato1 por centinela

Cuál es el error?

Siempre lees el mismo objeto Persona dentro del bucle, por lo que reemplaza el valor anterior. Supongo que no es eso lo que pretendes.
Si lo que quieres es cambiar alguna propiedad de Persona, deberías usar otra variable dentro del bucle, y reemplazar las propiedades que desees en la original.

abril 4, 2014 | Registered Commenterchoces

Entiendo lo que dices, pero lo que quiero es que me lea todos los datos excepto el valor de Centinela (public static final Persona CENTINELA = new Persona ("zzz", 999)).

Pero lo que me hace el método es leerme los datos del 1 a N-1 siendo N centinela, por lo tanto se salta el valor Real de N (introducido por el usuario).

Por cierto, muchas gracias por contestar :)

Si ese "centinela" es una instancia de Persona, entonces no entiendo esta línea:

while (!(a.Centinela())) {

abril 4, 2014 | Registered Commenterchoces

Solucionaadooo!! El problema estaba en la escritura del archivo.

Guenas.

Me alegro de que lo hayas solucionado, pero te prometo que no he entendido nada de nada.

Un saludo

abril 4, 2014 | Unregistered CommenterPaposo

Me alego de ver que ya somos dos....


Lo que me está haciendo es imprimir todo el valor de a A partir de el dato número 2 sustituyendo el Dato1 por centinela
Cuál es el error?

WTF!!!

abril 4, 2014 | Unregistered CommenterUnoPorAhi

Jajajajajaja. Me gustaría explicar lo que estaba haciendo.

Estoy trabajando con Archivos binarios con un programa que guardaba Nombre, Localizacion, Edad y un método que proporcionaba número a la persona. Para facilitar la lectura del archivo, decidí colocar un valor de centinela (flags) ("zzz" (cuestion de nombre) y "999" (en cuanto a número)).

Por lo tanto opté por dividir en diferentes clases la lectura y escritura del objeto para facilitarme el trabajo. Todo iba perfecto en cuanto a escritura, todos los datos se escribían perfectamente en el archivo "Localizacion.dat" que al abrirlo con editor hexadecimal podía ver los datos binarios introducidos. Pero al intentar verlo por consola, al llamar al método FileINputStream de lectura, me saltaba a la Persona cuyo número era el "1" y me mostraba por pantalla la Persona número "2". Por lo tanto, la persona número 1 pasaba a tener el valor Nombre: zzz y número 999, cuando en verdad debería mostrar el dato real introducido por el usuario.

Ese era mi problema, el cual lo solucioné dividiendo en métodos las escrituras y eliminando el valor de Centinela

Joer, Ahora lo pillo!.
Es parecido a lo que me ocurrió el otro día.

Se me enzarulló el canal de entrada por que se solapaba el algoritmo de renumeración con la estocástica que usaba para implementar el volcado a disco. Por suerte, una lectura secuencial de los indices me solucionó el problema al randomizar los accesos a RAM.

Es broma ehhhh! :) Es sábado y mola tener fiesta :)

Un saludo

abril 5, 2014 | Unregistered CommenterPaposo

Paposo: Jajajajajaja por un momento me quedé todo loco !!

Disfruta del día ;)