Ver Mensaje Individual
  #11 (permalink)  
Antiguo 27/09/2008, 03:23
GreenEyed
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 5 meses
Puntos: 51
Respuesta: Obtener array de bytes a partir de un file

Cita:
Iniciado por djagu_26 Ver Mensaje
En realidad es una aplicacion web, se supone que tenemos un servior entero contratado en miami para corre la aplicacion, o sea no deberiamos tener problemas con el uso del mismo, por mas que 100 usuarios esten usando la aplicacion que en ese mismo momento
No es cuestion de que el servidor sea o no suficiente. Es que es algo que depende del S.O. y, lo mas importante, no puedes garantizar que funcionará bien. Un programa que funciona bien a veces no es un programa correcto, aunque ahora mismo no falle. No hay vuelta de hoja.


Cita:
Iniciado por djagu_26 Ver Mensaje
en cuanto al tema de sencilles no lo digo por la cantidad de lineas, me parece raro no tener un metodo de los InputStream, FileInputStream, BufferedFileReader, etc que ya te devuelva el array de bytes que algo que se debe usar muchisimo en programacion me entiendes?
Si y no . Tampoco es tan común leer todo en memoria, ya que no suele ser la forma más eficiente de trabajar con ficheros. Además, hay que tener en cuenta que el API IO en Java está hecho para funcionar igual con ficheros, sockets, y cualquier otra cosa que maneje "tiras de bytes", y en muchos casos leerlo todo de golpe no es posible ni deseable, así que es "normal" que no incluya un metodo genérico para hacerlo. De todas formas hacerlo es relativamente sencillo.

El metodo que enlaza Blackwind funciona y es más estilo "C", usando solo un buffer y usando offsets, aunque tiene un problema por que si salta una excepcion despues de abrir el fichero, el InputStream quedaría abierto.

Cita:
Iniciado por djagu_26 Ver Mensaje
Tienes algun ejemplo de esto para pasarme?
Mas o menos, algo así. Hay que tener en cuenta que si el fichero es de texto, mejor usar los equivalente en Reader... Si no fuera un ByteArrayOutputStream , seguramente tambien encapsularía el OutputStream con un BufferedOuputStream y el reset/flush serían distintos, con un close etc. El buffer lo he hecho de 4K, pero se podría hacer más grande segun la memoria que queramos destinar a eso. 16K o 32K tampoco son ninguna barbaridad, en función del I/O de nuestro sistema.

A lo mejor no es tan eficiente como otras soluciones, pero sirve practicamente igual para cualquier tipo de InputStream y no deja nunca abierto el InputStream que recibe. Como se puede ver, el numero de lineas y lo verborreico de un codigo no me importa. Me importa más que no de problemas y sea claro .
Código PHP:
    String fileName "...";
    
byte[] fileContent null;
    
ByteArrayOutputStream theBAOS = new ByteArrayOutputStream();
    
FileInputStream theFIS null;
    try
    {
      
theBAOS.reset();
      
theFIS = new FileInputStream(fileName);
      
BufferedInputStream theBIS = new BufferedInputStream(theFIS);
      
byte[] buffer = new byte[4096];
      
int bytesRead;
      while ((
bytesRead theBIS.read(buffer)) >= 0)
      {
        
theBAOS.write(buffer0bytesRead);
      }
      
theBAOS.flush();
      
fileContent theBAOS.toByteArray();
    }
    catch (
IOException e)
    {
      
// Notificar error y si hace falta, encapsular la excepción y/o relanzar
    
}
    
finally
    
{
      if (
theBAOS != null)
      {
        
theBAOS.reset();
      }
      if (
theFIS != null)
      {
        try
        {
          
theFIS.close();
        }
        catch (
IOException e)
        {
          
// Notificar error cerrando fichero, seguramente aqui no hace falta relanzar pero si escribirlo en los logs
          // por que no deberia pasar
        
}
      }
    } 
S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.