Foro de elhacker.net

Programación => Java => Mensaje iniciado por: tenji en 28 Septiembre 2012, 18:15 pm



Título: Insertar numeros ordenados en un fichero a partir de otros dos ficheros
Publicado por: tenji en 28 Septiembre 2012, 18:15 pm
Hola a todos. Necesito extraer números leidos de 2 ficheros para insertarlos de manera ordenada en un nuevo fichero que genero. Hay una dificultad añadida, no puedo usar array  :-(. ¿me podrias ayudar?. NO SE COMO PODER INSERTARLOS BIEN.
Este es mi código. En él, viene escrito el enunciado
Código:
import java.io.*;
import javax.swing.JOptionPane;

/**
*
Se quiere crear una clase llamada MezclaFicheros en la que se van
  a crear dos ficheros(llamados NUM1.dat y NUM2.dat con números
  enteros ). Los números de ambos ficheros los introducimos por
  teclado en orden creciente. Por ejemplo, primero introducimos
  Nº números del fichero 1(p.ej:4), introducimos los números
  (p.ej: 4,6,8,10) y después los del otro fichero (1,3,5,7,8).
          Una vez creado ambos ficheros, crearemos otro llamado MEZCLA.dat  que
          tendrá los números de los dos ficheros mezclados en orden.     (1,3,4,5,6,7,8,8,10).
*/
       public class MezclaFicherosSinArray {

/**
* Método escribirFichero. Dado un nombre de fichero, escribe una serie de numeros
* introducidos por teclado
* @param nombreFichero
* @throws IOException
*/
public static void escribirFichero(String nombreFichero) throws IOException{

    File fichero =new File (nombreFichero);
    FileOutputStream fileout = new FileOutputStream (fichero);
    DataOutputStream dataOS = new DataOutputStream(fileout);
    String texto=JOptionPane.showInputDialog("Cuantos numeros quiere introducir");
    int totalNum=Integer.parseInt(texto);
   
    for (int i=0;i<totalNum; i++)
    {
    String texto2=JOptionPane.showInputDialog("Inserte numero");
int num=Integer.parseInt(texto2);
        dataOS.writeInt(num);
    }
    dataOS.close(); //cerrar strearn

}
/**
* Método leerFichero. Método que lee numeros de un fichero
* @param nombreFichero
* @throws IOException
*/

public static void leerFichero(String nombreFichero)throws IOException{

    File fichero = new File (nombreFichero);
    FileInputStream filein = new FileInputStream (fichero) ;
    DataInputStream dataIS = new DataInputStream (filein);
 
    int e;
    try {
    while (true) {
       
        e = dataIS.readInt(); //recupera la edad
        System.out.println("Numero: "+ e);
    }
    }catch (EOFException eo) {}
    dataIS.close(); //cerrar stream

}

/**
*Método mezclaFicheros. Método que recoge numeros de 2 ficheros dados y los escribe de
*manera ordenada en uno nuevo llamado MEZCLA.DAT
* @param fichero1
* @param fichero2
* @throws IOException
*/
public static void mezclaFicheros(String fichero1, String fichero2) throws IOException{


    File fichero =new File ("MEZCLA.dat");
    FileOutputStream fileout = new FileOutputStream (fichero);
    DataOutputStream dataOS = new DataOutputStream(fileout);
   
    File ficheroleido1 = new File (fichero1);
    FileInputStream filein = new FileInputStream (ficheroleido1) ;
    DataInputStream dataIS = new DataInputStream (filein);
   
    File ficheroleido2 = new File (fichero2);
    FileInputStream filein2 = new FileInputStream (ficheroleido2) ;
    DataInputStream dataIS2 = new DataInputStream (filein2);
       
    int num1,num2;
   
    try {
    num1 = dataIS.readInt();
    num2= dataIS2.readInt();
    while (true)
    {
if(num1<num2)
{
dataOS.writeInt(num1);
        dataIS.readInt();
}else{
if(num1>num2)
{
dataOS.writeInt(num2);
        dataIS2.readInt();
}else{
    dataOS.writeInt(num2);
    dataIS.readInt();
}
}

    }
   
    }catch (EOFException eo) {}
   
    try{
    num1 = dataIS.readInt();
    while(true){
   
    dataOS.writeInt(num1);
    dataIS.readInt();
    }
    }catch(EOFException e){}
   
    dataIS.close();
    dataIS2.close();
    dataOS.close();
   
    System.out.println("RESULTADO FINAL");
    leerFichero("MEZCLA.dat");
}

/**
* Método main
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {

escribirFichero("NUM1.dat");
escribirFichero("NUM2.dat");

System.out.println("FICHERO NUM1.DAT");
leerFichero("NUM1.dat");

System.out.println("FICHERO NUM2.DAT");
leerFichero("NUM2.dat");

System.out.println("FICHERO MEZCLA.DAT");
mezclaFicheros("NUM1.dat", "NUM2.dat");


}


}




Muchas gracias, un saludo y espero que podais ayudarme


Título: Re: Insertar numeros ordenados en un fichero a partir de otros dos ficheros
Publicado por: fekaa30 en 30 Septiembre 2012, 05:27 am
Buenas noches.

Estuve leyendo el problema, te explico mas o menos los datos que podés obtener para poder lograr algo:

La clase DataInputStream que estás usando, es conveniente para guardar datos primitivos (por ejemplo, enteros en tu caso). Según he comprobado, una vez que comenzas a leer los datos, esos datos desaparecer de la memoria de ese objeto. El método available() de la clase DataInputStream permite obtener los bytes disponibles a leer. Cada entero que guardes en un archivo con la clase DataOutputStream, ocupa 4 bytes: ésto significa que si hacemos un (DataInputStream.available() / 4); obtenemos el número de enteros a leer de dicho archivo en memoria. Sin usar arreglos, se complica demasiado; aún así, una solución que se me ocurre es usar una lista enlazada simple de enteros, e ir guardando allí todos los datos. Luego, usas un algoritmo de ordenamiento de listas y la recorres guardando en el archivo MEZCLA.dat los numeros obtenidos (en forma ordenada).

Si no, se me ocurre otra solución, pero es muy "negra" (poco eficiente en mi lenguaje). Si lo solucionas, me avisas cómo lo hiciste, y si se te ocurre alguna idea coméntala así podremos analizarla juntos.

Saludos