Melhor tamanho para um pacote http

2 respostas
cancao

Estou criando uma aplicação que retornará alguns arquivos para o cliente. Esses arquivos não estão num diretorio publico então só podem ser acessados via servlet. Para escrever o arquivo, estou usando um recurso bem ignorante assim:

File file = new File("file.tal");
FileInputStream in = new FileInputStream(file);

int length = in.available();
byte[] cache = new byte[length];
in.read(cache);

response.setContentLength(length);
response.setHeader("Content-Disposition", "filename=" + file.getName());
response.getOutputStream().write(cache);

Bom, os principais problemas que vejo são:
:arrow: Arquivos muito grandes serão um problema para escrever tudo de uma vez só.
:arrow: Ainda sobre arquivos muito grandes, eles tomarão muita memoria e um grande acesso aos arquivos pode acabar sendo um problema.

Então, pensei em fazer algo como:

int TAM_IDEAL = xxx;
File file = new File("file.tal");
FileInputStream in = new FileInputStream(file);

int length = in.available() > TAM_IDEAL ? TAM_IDEAL : in.available();
byte[] cache = new byte[length];

response.setContentLength(length);
response.setHeader("Content-Disposition", "filename=" + file.getName());
while(in.read(cache) != -1) {
  response.getOutputStream().write(cache);
  response.getOutputStream().flush();
}

Então, que valor colocar em TAMANHO_IDEAL?! Isso vai otimizar alguma coisa?! Algum framework que facilite a vida para fazer o que estou querendo?! Estou usando o Tomcat em conjunto com o Apache no Windows 2000 Server.

Até.

2 Respostas

louds

simplesmente use 1 buffer de tamanho fixo:

File file = new File("arquivo.grande");
long tamanho = file.length();
response.setContentLength(length);
response.setHeader("Content-Disposition", "filename=" + file.getName());

InputStream in = new new FileInputStream(file);
OutputStream out = response.getOutputStream();
ibyte[] buffer = new byte[8096];
int t;
while((t = in.read(buffer)) != -1) 
  out.write(buffer, i);
cancao

Hum, mas, louds, o tamanho do buffer que vc usou, 8096, tem algum sentido tecnico? Qual? Eu acabei percebendo que o setContentLength no segundo codigo que postei tava “bugado” pois estava usando o tamanho do buffer e não do arquivo. :oops:
Sobre seu codigo:

int t; 
while((t = in.read(buffer)) != -1) 
  out.write(buffer, i);

Esse t num precisa não, precisa? Caramba… quanta pergunta… :lol:

Até.

Criado 26 de outubro de 2003
Ultima resposta 26 de out. de 2003
Respostas 2
Participantes 2