Dúvida funcionamento de while

Não consegui compreender uma parte do código abaixo, (está em uma servlet):

public void doGet(...)	throws ...{

		response.setContentType("application/jar");

		ServletContext ctx = this.getServletContext();
		InputStream is = ctx.getResourceAsStream("/bookCode.jar");

		int read = 0;
		byte[] bytes = new byte[1024];

		OutputStream os = response.getOutputStream();

		while ((read = is.read(bytes)) != -1) {
			os.write(bytes, 0, read);
		}

	}

Eu sei que ele pega um arquivo jar, cria um outputStream e o preenche com esse arquivo jar.
O que eu não entendi é o funcionamento desse while, eu sei o que ele faz(por que estava escrito no livro), mas não entendi o diferente de -1,
nem o is.read(bytes).

O que tu não entendeu? O motivo da condição usar o “-1”?

Isso tem relação com código ASCII. O “-1” é um caracter que não existe em ASCII, portanto, enquanto o loop encontra caracteres válidos na cadeia ele entra no loop. Quando não encontrar mais nada (-1), ele sai.

esse while vai escrever o seu arquivo na pagina, assim vc vai poder fazer download

qto ao read ele vai ler o arquivo local para escrever na pagina

[quote=pvrsouza]O que tu não entendeu? O motivo da condição usar o “-1”?

Isso tem relação com código ASCII. O “-1” é um caracter que não existe em ASCII, portanto, enquanto o loop encontra caracteres válidos na cadeia ele entra no loop. Quando não encontrar mais nada (-1), ele sai.

[/quote]

na verdade -1 não significa ‘nada’, siginifica EOF (End of File), e EOF é representado por -1

Ops. É isso mesmo! Perdoem a falha! Mas foi com boa intenção! Rsrsrsrsr :smiley:

Será que o problema é mesmo o -1 ou o facto de fazer a atribuição e comparação na mesma linha?

Já foi explicado atrás o porquê do -1. Se ajudar a compreender, vê o seguinte código que é exactamente a mesma coisa:

   read = is.read(bytes);
   while  (read != -1) {  
             os.write(bytes, 0, read);  
             read = is.read(bytes);
   }  

Exatamente.

Eu dei uma lida no javadoc(http://www.docjar.com/docs/api/java/io/InputStream.html#read),
e entendi melhor, o que eu achei estranho é que esse método read (pelo que eu entendi) lê quantos
caracteres conseguir, não um por vez, nem todos de uma vez (retorna um int referente a isso).

Mas agora está claro. E eu também não tinha visto atribuição e comparação na mesma linha, falta de cultura a minha.

Obrigado a todos.

Ele retorna um valor inteiro porque em ASCII os caracteres são representados por números.

Da uma olhada na documentação do método read() da classe InputStream.

La explica direitinho o que significa cada valor retornado.

At.