Foros del Web » Programación para mayores de 30 ;) » Java »

byte[] to Object[]

Estas en el tema de byte[] to Object[] en el foro de Java en Foros del Web. Estimados foristas. Una vez mas requiero de su poderosa ayuda. Resulta que tengo un objeto que requiere enviarle un Object[] para que funcione Código: ... ...
  #1 (permalink)  
Antiguo 07/05/2012, 18:28
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 19 años, 4 meses
Puntos: 1
Pregunta byte[] to Object[]

Estimados foristas.

Una vez mas requiero de su poderosa ayuda. Resulta que tengo un objeto que requiere enviarle un Object[] para que funcione

Código:
...
Object[] archivoEnObjectCargadoEnVisor = new Object[]{fileChooser.getSelectedFile().getAbsolutePath()};
visor_jpedal.getViewer().executeCommand(Commands.OPENFILE, archivoEnObjectCargadoEnVisor);
...
Esto funciona... pero si por casualidad de la vida no tengo la ruta absoluta del archivo sino los bytes[] del mismo .. como hago que funcione lo anterior?

He intentado ..

Código:
....
ByteArrayInputStream bain = new ByteArrayInputStream(archivoEnBytes);
bain.reset();
ObjectInputStream ois = new ObjectInputStream(bain);
archivoEnObjectCargadoEnVisor = new Object[]{ois};
visor_jpedal.getViewer().executeCommand(Commands.OPENFILE, archivoEnObjectCargadoEnVisor);
....
y esto


Código:
....
ByteArrayInputStream bain = new ByteArrayInputStream(archivoEnBytes);
bain.reset();
ObjectInputStream ois = new ObjectInputStream(bain);
archivoEnObjectCargadoEnVisor = (Object[]) ois.readObject();
visor_jpedal.getViewer().executeCommand(Commands.OPENFILE, archivoEnObjectCargadoEnVisor);
....
pero nada... me pueden colaborar...

Muchas gracias y muchos éxitos.
  #2 (permalink)  
Antiguo 08/05/2012, 01:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 13 años, 10 meses
Puntos: 188
Respuesta: byte[] to Object[]

Lo que necesitas es un serializador

public static byte[] serialize(Object obj) {
ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(obj);
return out.toByteArray();
}
// Tu metodo
public static Object deserialize(byte[] data) {
ByteArrayInputStream in = new ByteArrayInputStream(data); ObjectInputStream is = new ObjectInputStream(in);
return is.readObject();
}

Ahora tienes un Object, y lo que tienes q hacer es crear un Object[] y meterle el Object dentro.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 08/05/2012, 11:51
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 19 años, 4 meses
Puntos: 1
Sonrisa Respuesta: byte[] to Object[]

Muchas gracias por responder Fuzzylog.

Acá tenemos un inconveniente... el archivoEnBytes es el contenido (bytes[]) de un archivo PDF. Cuando intento hacer lo sugerido me sale el error invalid stream header: 25504446.

Alguna otra sugerencia.. Hay un par de constructores... cuando se manda un String (que es la ruta obtenida del fileChooser y ejecutarlo bien) y la otra es enviando los byte[] de un archivo (PDF)... esto segundo es que no me anda.



Para emular el envío de los byte[] utilizo lo obtenido de la siguiente función....

Código:
public static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);

        // Get the size of the file
        long length = file.length();

        if (length > Integer.MAX_VALUE) {
            // File is too large
            return null;
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int) length];

        // debug - init array
        for (int i = 0; i < length; i++) {
            bytes[i] = 0x0;
        }

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
            offset += numRead;
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }

        // Close the input stream and return bytes
        is.close();
        return bytes;
    }

Última edición por Hollman; 08/05/2012 a las 11:56 Razón: complementar respuesta
  #4 (permalink)  
Antiguo 08/05/2012, 12:26
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 13 años, 10 meses
Puntos: 188
Respuesta: byte[] to Object[]

Igual tienes que poner correctamente los metadata antes de guardar el pdf...

https://www.google.es/#hl=es&sclient...w=1280&bih=858

Entre ellos el mime-type, que para pdf es application/pdf

Luego convendría guardar el nombre y la extensión del archivo en otro campo de la BD para poder recuperarlo como si fuese el original, y si es necesario, volver a setear los metadata para el archivo recuperado.

Suerte
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 08/05/2012, 14:14
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 19 años, 4 meses
Puntos: 1
Sonrisa Respuesta: byte[] to Object[]

Hola Fuzzylog.


Me da una verguenza infinita.. pero INFINITA pero no entendí. Traté de encontrar lo que vos me dijiste pero no veo en que punto tengo que decirle que es un PDF. Dentro de mi secuencia tengo:

1. Cargar un archivo pdf a través de un fileChooser.
2. Crear un File archivoSeleccionado con el String devuelto en el punto 1.
3. Crear una variable byte[] archivoEnBytes = getBytesFromFile(archivoSeleccionado); =>Funcion enviada previamente.
4. Donde está el meollo,cuento,enigma es pasar archivoEnBytes a tipo Object[] archivoEnObjectCargadoEnVisor.
5. Cargar archivoEnObjectCargadoEnVisor en el visor JPedal. visor_jpedal.getViewer().executeCommand(Commands.O PENFILE, archivoEnObjectCargadoEnVisor);
6. Teniendo al PDf en formato byte[] puedo implementar rapida y fácilmente: Rotar página, Borrar página, Insertar folio, etc

Reitero hago este vuelton porque estoy haciendo contructores que reciban tanto un String (ruta) como un byte[] de un archivo PDF. Con la ruta fuinciona bien.

En ningún momento.. hasta ahora he persistido el PDF (posteriormente lo haré un ftpClient.storeFileStream) por ello no se donde implementar lo expresado por Fuzzylog.

Agradezco altamente--- altísimamente tu colaboración .. especialmente Fuzzylog.

Última edición por Hollman; 08/05/2012 a las 14:47 Razón: Complementar respuesta.
  #6 (permalink)  
Antiguo 09/05/2012, 10:10
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 19 años, 4 meses
Puntos: 1
De acuerdo Respuesta: byte[] to Object[]

Hola Foristas.

Dí solución alterna al inconveniente. La firma del método de executeCommand

.executeCommand(Commands.OPENFILE, Object[] variable);

exige un Objeto[] como segundo parámetro. Como el proyecto es GPL me baje los fuentes y mire que podia enviar la misma variable tipo Object[] pero con otro contenido (al de solo la ruta física del archivo pdf cargado por el fileChooser).

Objeto[] xyz = new Object[2];
xyz[0] = getBytesFromFile(new File (fileChooser.getSelectedFile().getAbsolutePath())) ;
xyz[1] = "dummy.pdf";
visor_jpedal.getViewer().executeCommand(Commands.O PENFILE, xyz);

Así pude continuar con lo que quería hacer.. tal vez le pueda servir a alguien a futuro.


Muchas gracias Fuzzylog por tu colaboración.


Muchas gracias a todos y muchos éxitos. .

Etiquetas: byte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:27.