Autor Tema: Java crear y Mostrar archivo binario copiar contenido con FileInputStream  (Leído 11699 veces)

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Hola. En un trabajo anterior tuve que hacer en Pascal Mostrar.pas y Crear.pas para archivos .dat. Me adjuntaron el EXAMEN2.dat para mostrarlo y después crear un archivo similar.

El .dat tiene la siguiente estructura:

Código: [Seleccionar]
THeader = record
    Serial: Word;   //2 bytes
    Filename: String[255];  //1 byte
    Date: Word;  //2 bytes
    Fieldnrs: Word;  //2 bytes
    NrsRecords: Word;  //2 bytes
  end;
  TFields = record
    Fieldnr: Word;   //2 bytes
    Fieldname: ShortString;   //1 byte
  end;
  TRecordField = record
    Fieldnr: Word;  //2 bytes
    FieldText: String[255];  //1 byte
  end;
    TDateTime = double;


Tengo que pasarlo a Java y hasta ahora solo logré esto:

Código: [Seleccionar]
package examen2;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class mostrar {
public static void main(String[] args) {
        FileInputStream fis = null;
        DataInputStream entrada = null;
        int n;
        try {
            fis = new FileInputStream("C:/Dev-Pas/EXAMEN2.dat");
           
           
            StringBuilder builder = new StringBuilder();
            int ch;
            while((ch = fis.read()) != -1){
                builder.append((char)ch);
            }
            System.out.println(builder.toString());
           
           
            entrada = new DataInputStream(fis);
            while (true) {   
                n = entrada.readInt(); 
                System.out.println(n); 
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (EOFException e) {
            System.out.println("Fin de fichero");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
                if (entrada != null) {
                    entrada.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

Compila, pero no de la forma deseada.

Adjunto:
crear.pas
mostrar.pas
archivo.dat a mostrarprimero
la clase de java
consigna
imagen de ejemplo como debe mostrarse

muchas gracias.
« Última modificación: 05 de Noviembre 2015, 09:00 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Java - Crear y Mostrar un archivo binario
« Respuesta #1 en: 03 de Noviembre 2015, 09:43 »
Hola!

He visto tu consulta pero no he acabado de entender bien cuál es el objetivo. He visto los archivos adjuntos pero veo una consigna demasiado larga. Para obtener respuesta tienes que definir bien cuál es el problema y plantear las cuestiones de una en una, no dar una consigna extensa.

Recomendable leer https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0 ahí se indica esto:

Recomendaciones generales para consultas: no hagas consultas sobre problemas muy extensos o fragmentos de código muy extensos. Antes de hacer una consulta, intenta resolver tú mismo el problema. Cuando no sepas cómo avanzar, prepara el código necesario y pégalo, indicando dónde obtienes un error o no sabes avanzar. Describe cuáles son los objetivos que persigues de una forma clara y breve. Ten en cuenta que las personas que participan respondiendo voluntariamente en los foros en general responden cuestiones concretas y bien definidas, pero no resuelven ejercicios completos ni analizan consignas, enunciados o código de gran extensión porque sería demasiado costoso.

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java - Crear y Mostrar un archivo binario
« Respuesta #2 en: 03 de Noviembre 2015, 16:54 »
Gracias por la respuesta.

Resumiéndolo mucho la cuestión es que no muestra los datos listados correctamente. los muestra todos en una sola oración como si lo estuviera viendo desde un editor hexadecimal.

Cómo hago para leer cada registro por separado? aparte donde se almacena la fecha tengo que aplicar la funcion para calcular la fecha de verdad.
« Última modificación: 05 de Noviembre 2015, 08:58 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java - Crear y Mostrar un archivo binario
« Respuesta #3 en: 04 de Noviembre 2015, 13:03 »
Eso tiene que ver con el toString() creo

Código: [Seleccionar]
  System.out.println(builder.toString());
 que muestra de golpe en una oracion todo el contenido del texto porque no has sobreescrito el metodo.

Creo que por eso lo ves todo en una oración, el resto no le veo problema yo.

Otra solución podria ser un while o un for que lea cada linea y la imprimas con el toString() por separado, linea a linea mientras.
« Última modificación: 05 de Noviembre 2015, 08:58 por César Krall »

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java - Crear y Mostrar un archivo binario
« Respuesta #4 en: 08 de Noviembre 2015, 00:28 »
Lo hice de esta manera, tengo mis dudas con los arrays...

Código: [Seleccionar]
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {

teclado tc = new Scanner(System.in);
        FileOutputStream fos = null;
        DataOutputStream salida = null;
        int n;
        short s; //serial (2bytes)
        char f;  //filename (2bytes)
        byte t;  //# campos custom (1byte)
        byte c;
        byte i;  //contador FOR
        char x;  //nombre de dato nro
        int d;  // fecha actual sistema
        byte r; //cantidad de registros
        int v[]; //VECTOR numero
        char b[]; //vector letras
        int Camp; //contador de campos completados
        int k;

        try {
            fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
            salida = new DataOutputStream(fos);

            System.out.print("Introduce número Serie:"); //serial
            s = tc.nextShort();
           
            System.out.print("Ingrese Nombre Archivo:"); //path
            f = tc.nextChar();
           
            //CALCULAR FECHA ACA //fecha
            salida.writeInt(d);
           
           
            System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
            t = tc.nextByte();
           
            v = new int[t+1]; //aca esta el vector 0,1,2,3,...,t+1
            b = new char[t+1];
           
            for(i=1; i<t+1; i++) //codigo 1,2,3,4
            {
              v[t]=i;   // Campo[tal].suNumero
              salida.writeByte(t);
              System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
              tc.nextChar();   // escribir el vector[i] nombrecampo
               
              salida.writeChar(b[i]);
            }
           
            System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
            r = tc.nextByte();
            salida.writeByte(r);
           
            System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
            for(i=1; i<=r; i++)  //desde el primer contacto hasta el ultimo
            {
            for (k=1; k<=t; k++)  //desde el primer campo customizado hasta el ultimo
                {
                System.out.print("Ingrese"+b[k]);
                tc.nextChar(b[k]);
                if b.length <>0
                {
                  Camp=(Camp+1);
                }
                }
            }
            salida.writeInt(Camp);
                                     
            for (c=1; c<=t; c++)  //cant campos custpm
            {
             v[c]=c;
            if Length(b[c]) <> 0
            {
            salida.write(v[c]);
            salida.write(b[c]);       
            }
            }
            Camp=0;  //FIN
           

        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (salida != null) {
                    salida.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

}
« Última modificación: 11 de Noviembre 2015, 08:19 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #5 en: 08 de Noviembre 2015, 20:47 »
Bueno si te funciona lo que pretendías hacer, ya esta bien. Hace lo que querías, al final era por el toString ? si pegas codigo comenta las dudas que tengas para buscar posibles fallos.

Saludo.

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #6 en: 08 de Noviembre 2015, 22:30 »
Es que falla. Pido ayuda con los arrays.

Código: [Seleccionar]
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {

teclado tc = new Scanner(System.in);
        FileOutputStream fos = null;
        DataOutputStream salida = null;
        int n;
        short s; //serial (2bytes)
        char f;  //filename (2bytes)
        byte t;  //# campos custom (1byte)
        byte c;
        byte i;  //contador FOR
        char x;  //nombre de dato nro
        int d;  // fecha actual sistema
        byte r; //cantidad de registros
        int v[]; //VECTOR numero
        char b[]; //vector letras
        int Camp; //contador de campos completados
        int k;

        try {
            fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
            salida = new DataOutputStream(fos);

            System.out.print("Introduce número Serie:"); //serial
            s = tc.nextShort();
           
            System.out.print("Ingrese Nombre Archivo:"); //path
            f = tc.nextChar();
           
            //CALCULAR FECHA ACA //fecha
            salida.writeInt(d);
           
           
            System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
            t = tc.nextByte();
           
            v = new int[t+1]; //aca esta el vector 0,1,2,3,...,t+1
            b = new char[t+1];
           
            for(i=1; i<t+1; i++) //codigo 1,2,3,4
            {
              v[t]=i;   // Campo[tal].suNumero
              salida.writeByte(t);
              System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
              tc.nextChar();   // escribir el vector[i] nombrecampo
               
              salida.writeChar(b[i]);
            }
           
            System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
            r = tc.nextByte();
            salida.writeByte(r);
           
            System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
            for(i=1; i<=r; i++)  //desde el primer contacto hasta el ultimo
            {
            for (k=1; k<=t; k++)  //desde el primer campo customizado hasta el ultimo
                {
                System.out.print("Ingrese"+b[k]);
                tc.nextChar(b[k]);
                if b.length <>0
                {
                  Camp=(Camp+1);
                }
                }
            }
            salida.writeInt(Camp);
                                     
            for (c=1; c<=t; c++)  //cant campos custpm
            {
             v[c]=c;
            if Length(b[c]) <> 0
            {
            salida.write(v[c]);
            salida.write(b[c]);       
            }
            }
            Camp=0;  //FIN
           

        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (salida != null) {
                    salida.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

}
uso eclipse mars ver4.5.1
« Última modificación: 11 de Noviembre 2015, 08:19 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #7 en: 09 de Noviembre 2015, 14:58 »
Buenas, no soy muy capaz asi con ese trozo de código de entender bien lo que hace ( otros seguro que si pueden).

Pero yo comentarte que donde defines los array con t+1, normalmente los arrays empiezan en 0, asi que si le sumas uno a la cantidad recibida, te puede dar excepcion de nullpointerException.

No se si esto te sirve de algo.

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #8 en: 09 de Noviembre 2015, 22:45 »
Porque trato de que quede, por ej:

1.Nombre
2.Telefono
3.Direccion
4.Email

en vez de:

0.Nombre
1.Telefono, etc.

tengo entendido que los arrays inician de 0. lo que quiero saber es como escribirle el dato al array.

pido primero crear un vector que va a contener codigos (1,2,3,4) y su respectivo nombre de dato (nombre, tel, dir, email). en Pascal seria asi:
Rec[C].Fieldnr //vector codigo de dato (1,2,3,4)
Rec[C].Fieldname//vector nombre de dato (nomb,tel,dir,etc).
despues haria otro vector distinto que tendria el numero del dato y el texto:
Rec[C].Fieldnr
Rec[C].FieldText
« Última modificación: 20 de Noviembre 2015, 17:30 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #9 en: 09 de Noviembre 2015, 23:26 »
Bueno lo que yo haria, si lo que quieres es usar un array para guardar la información que pides.

Si son por ejemplo, 4 parametros, Nombre, Apellidos, Edad y Sueldo (por ejemplo)
Código: [Seleccionar]
String [] arrayEmpleado = new String [4];
private Scanner teclado;

for (int i = 0; i < 4; i++){
    teclado = new Scanner(System.in);
    arrayEmpleado[i] = teclado.nextLine();
}
   
Después una vez recogida la información como String ya la transformarás al dato que quieras. Int etc..

No se si te sirve la idea.

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #10 en: 10 de Noviembre 2015, 18:19 »
gracias por la respuesta. le cambie unas cosas pero me sigue tirando errores en las sig. lineas:
teclado tc = new Scanner(System.in);

if arrayNameDato.length<>0 //trato de calcular el largo del string en el array

salida.writeInt(arrayNumDato[c]);
salida.writeInt(arrayNameDato[c]);

salida.writeString(arrayNameDato);
 
Código: [Seleccionar]
package examen4;
import java.util.Scanner;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class crear {
private static Scanner teclado;
public static void main(String[] args) {

teclado tc = new Scanner(System.in);
        FileOutputStream fos = null;
        DataOutputStream salida = null;
        int n;
        short s; //serial (2bytes)
        char f;  //filename (2bytes)
        byte t;  //# campos custom (1byte)
        byte c;
        byte i;  //contador FOR
        char x;  //nombre de dato nro
        int d;  // fecha actual sistema
        byte r; //cantidad de registros
        int v[]; //VECTOR numero
        char b[]; //vector letras
        int Camp; //contador de campos completados
        int k;

        try {
            fos = new FileOutputStream("C:/Dev-Pas/EXAMEN444.dat");
            salida = new DataOutputStream(fos);

            System.out.print("Introduce número Serie:"); //serial
            s = tc.nextShort();
           
            System.out.print("Ingrese Nombre Archivo:"); //path
            f = tc.nextChar();
           
            //CALCULAR FECHA ACA //fecha
            salida.writeInt(d);
           
           
            System.out.print("Ingrese Cantidad de Campos Customizados:"); //campos custom
            t = tc.nextByte();
           
           
            Byte [] arrayNumDato = new Byte [t];
            String [] arrayNameDato = new String [t];
           
           
            for(i=1; i<t+1; i++) //codigo 1,2,3,4
            {
              arrayNumDato[i]=i;   // Campo[tal].suNumero
              salida.writeByte(i);
              System.out.print("Ingrese Nombre de dato numero"+t); //nombre,tel,dir,email
              arrayNameDato[i] = tc.nextLine();
              tc.nextString();   // escribir el vector[i] nombrecampo
               
              salida.writeString(arrayNameDato[i]);
            }
           
            System.out.print("Ingrese la cantidad de registros:"); //cantidad de registros
            r = tc.nextByte();
            salida.writeByte(r);
           
            System.out.print("Ingrese los"+r+"contactos"); //datos contactos concretos
            for(i=1; i<=r; i++)  //desde el primer contacto hasta el ultimo
            {
            for (k=1; k<=t; k++)  //desde el primer campo customizado hasta el ultimo
                {
                System.out.print("Ingrese"+arrayNameDato[k]);
                tc.nextString(arrayNameDato[k]);
                if arrayNameDato.length<>0
                {
                  Camp=(Camp+1);
                }
                }
            }
            salida.writeInt(Camp);
                                     
            for (c=1; c<t+1; c++)  //cant campos custpm
            {
            arrayNumDato[c]=c;
            if arrayNameDato.length<>0  //largo del dato distinto de cero
            {
            salida.writeInt(arrayNumDato[c]);
            salida.writeInt(arrayNameDato[c]);
            }
            }
            Camp=0;  //FIN
           

        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (salida != null) {
                    salida.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #11 en: 12 de Noviembre 2015, 18:50 »
Buenas
La de teclado tc = new Scanner... tienes que quitar el tc, tu has declarado Scanner teclado, el nombre es teclado. El resto mañana lo miro.

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #12 en: 12 de Noviembre 2015, 23:04 »
Muchas gracias. mi principal problema con el Crear es hacer dos vectores asi:

Vector1. Código del campo/Descripción del campo

Vector2. Cantidad de campos completos/Código del campo/Contenido del campo

tambien hacer un IF largo del contenido del vector es distinto de 0:
if arrayNameDato.length<>0
« Última modificación: 20 de Noviembre 2015, 17:30 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #13 en: 16 de Noviembre 2015, 23:16 »
Explica que quieres hacer mas exactamente o pon el trozo de codigo que tengas ya hecho para que te ayudemos.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #14 en: 17 de Noviembre 2015, 15:47 »
Buenas,
cuando le pides que te introduzcan los campos Customizados, no se porque recoges un Byte, cuando lo logico es recoger un Int, 1 campo 2 campos 3 campos....
Código: [Seleccionar]
t = tc.nextByte();
           
           
            Byte [] arrayNumDato = new Byte [t];
            String [] arrayNameDato = new String [t];

Y luego al crear el array de String con un nextByte pues yo creo que te descuadra todo.
Si los campos son numeros enteros, prueba con nextInt(); y guardalo en un int.
Así sabrás el numero de campos que debe tener el array y los solicitas todos con un bucle hasta ese int.

Deberías hacer el curso java de esta web, es realmente estupendo y no caerías en dudas elementales que te retrasan muchisimo.
Un saludo.
« Última modificación: 17 de Noviembre 2015, 15:50 por Lorenzo31 »

EMP_47

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #15 en: 19 de Noviembre 2015, 23:43 »
"t" es el numero de campos customizados, por eso los dos arrays se repiten "t" veces.
« Última modificación: 20 de Noviembre 2015, 17:30 por César Krall »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java crear y Mostrar archivo binario copiar contenido con FileInputStream
« Respuesta #16 en: 20 de Noviembre 2015, 16:27 »
No hablo de eso. me Refiero a la declaración de t. es un Byte t cuando deberia ser un Int t.
Al menos si vas a crear un array de t elementos, la t debe ser un entero.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".