Jump to content
iniciante

ler ficheiro d x em x bytes

Recommended Posts

iniciante

Boa noite. eu estou a criar uma aplicação para enviar ficheiros para um webserver. Estou com problemas a enviar ficheiros com mais de 600kb e por isso queria ler um ficheiro de 200 em 200 bytes ou 300 em 300 bytes..! podem dar-me uma ajuda?


RC

Share this post


Link to post
Share on other sites
iniciante

nao fiquei mto esclarecido com essa rsp...

eu estou a fazer um ciclo para converter o ficheiro para bytes:

	      File f = new File(fileName);
	      FileInputStream in = new FileInputStream(f);
	      byte[] bytes = new byte[(int)f.length()];
	      int c = -1;
	      int i = 0;
	      
	      while ((c = in.read()) > -1) {
                 bytes[i] = (byte)c;
	        i++;
	      }

dps disto vou fazer um Base64.encodeToString para enviar para o webserver... e é neste encode que ele rebenta por o ficheiro ser grande de mais..dai querer ler d x em x bytes para fazer o encode aos poucos...


RC

Share this post


Link to post
Share on other sites
daj

Já agora, porque é que codificas o ficheiro em base64 em vez de enviar logo os dados?

E o que queres dizer exactamente por "rebenta por o ficheiro ser grande de mais"? Quem é que rebenta? E em que instrução?

Share this post


Link to post
Share on other sites
iniciante

se eu enviar os bytes ele da-me um erro no ksoap2 a dizer java.lang.RuntimeException: cannot serialize: {B@40590b40.

ele rebenta no base64..se enviar os bytes de um ficheiro com 1mb por exemplo, ele quando esta a fazer o encode da a excepção out of memory.


RC

Share this post


Link to post
Share on other sites
iniciante

mas gravar como? =/ o que eu estou a fazer é uma aplicaçao para telemovel.. le um ficheiro do cartao de memoria e envia para o webserver feito em C#. aquilo que eu queria era quando esta a ler este ciclo

while ((c = in.read()) > -1) {
                 bytes[i] = (byte)c;
                 i++;
               }

que envia-se logo para o base64.encodetostring e fosse construir a string aos poucos para evitar os erros quando forem ficheiros grandes.


RC

Share this post


Link to post
Share on other sites
daj

Ah, a aplicação está a correr num sistema com recursos reduzidos. Então porque não fazes algo do género do código seguinte?

File f = new File(fileName);
FileInputStream in = new FileInputStream(f);
byte[] bytes = new byte[200];
int c = -1;
int i = 0;
int block = 0;
               
while ((c = in.read()) > -1) {
  bytes[i++] = (byte)c;
  if (i == 200) {
    encodeAndSend(bytes, i, block++);
    i = 0;
  }
}

/* Last block, may not be a multiple of 200 */
if (i != 0) encodeAndSend(bytes, i, block++);

isto supondo que o serviço consegue reconstruir o ficheiro a partir dos vários blocos. Acrescentei aquela variável block como sugestão de indicares ao serviço o número do bloco do ficheiro que estás a enviar.

Edit: sugeria que visses o método read() que lê um bloco, em vez de leres byte a byte.

http://download.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read(byte[])

Share this post


Link to post
Share on other sites
iniciante

problema resolvido.. meto a ler o tamanho do ficheiro caso tenha menos de 500kb , e se tiver mais de 500kb faço um ciclo para ir lendo de 500 em 500 ( que é o máximo que suporta para não rebentar) e no webservice vou lendo os bytes do ficheiro e vou juntando os recebidos!

obrigado pela ajuda daj! e sim ler em bloco torna o processo mto mais rápido e eficiente do que ler byte a byte..ja esta a funcionar a 100%

obrigado a todos


RC

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.