Gå til innhold

Hvordan lese og sende filer effektivt?


Anbefalte innlegg

Hvordan får man til dette? Jeg har følgende jspside som skal lese inn en fil fra et annet sted på disken, og sende den ut i browseren:

response.setContentType("");
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");

if(file.length() < Integer.MAX_VALUE)
 response.setContentLength((int)file.length());

 InputStream input = null;

try
{ 
 input = new FileInputStream(file);
 
 int b;
 while ((b = input.read()) > -1)
 {
 	out.write(b);
 	out.flush();
 }
}
catch (Exception e)
{
 System.out.println(e);
}
finally
{
 try
 {
 	input.close();
 }
 catch(Exception e)
 {
 	// dont care
 }
}

Dette fungerer, men det går utroolig tregt, og jvm jobber som en madman. Hva av alle disse readerne og inpustreamene bør en bruke for å lese inn en fil effektivt? Og hvordan kan jeg skrive den ut like effektivt? Jeg prøvde å bruke out.getOutputStream() og så bruke den istedet, da den støttet arrays med byte og ikke are enkeltbyte, men da får jeg en illigal stateexception eller noe sånt i jsp-server-loggen.. og det vil jeg jo helst unngå..

Lenke til kommentar
Videoannonse
Annonse

Du bør lage en BufferedReader.. husker ikke helt hvordan, men ca. noe slik:

 

BufferedReader in = new BufferedReader(new FileReader(new FileInputStream(file)));

 

Vet ikke om alle de leddene er nødvendig, men det kan du finne ut ved å lete litt i API.

 

Så kan du bruke følgende for å lese:

String s = in.readLine();

Da leser du ei hel linje av gangen, og ting er buffret etter at det er lest fra disk så det går en god del fortere.

Lenke til kommentar
Men vil det være helt bra å lese en hel linje av gangen når det blant annet er binære filer en leser fra? type bilder, video og rene tekstfiler.

8563266[/snapback]

 

Kan ikke anbefale å lese binære filer linje for linje siden de ikke består av linjer. En linje er bare en ascii-streng terminert av en newlinechar. Hvis du prøver å lese en binærfil linje for linje vil du få helt tilfeldige deler data, dvs. du leser helt til du treffer på bytekombinasjonen for \n.

Lenke til kommentar

funket med BufferedInputStream. Så det jeg endte opp med var:

if(file != null)
 {
 	response.setContentType("image/jpeg");
 	
 	long filesize = file.length();
 	if(filesize < Integer.MAX_VALUE)
 	{
   int contentLength = new Long(filesize).intValue();
   response.setContentLength(contentLength);
 	}
 	
 	BufferedInputStream input = null;
 	
 	try
 	{ 
   input = new BufferedInputStream(new FileInputStream(file));
   BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
   
   byte[] b = new byte[256];
   while (input.read(b, 0, b.length) > -1)
   {
   	output.write(b, 0, b.length);
   	output.flush();
   }
 	}
 	catch (Exception e)
 	{
   response.sendRedirect("blank.jpg");
   //System.out.println(e);
 	}
 	finally
 	{
   try
   {
   	input.close();
   }
   catch(Exception e)
   {
   	// dont care
   }
 	}
 }

dersom noen andre enn meg skulle være interessert :) Takk for hjelpen!

Endret av Tussi_qwerty
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...