toString(), StringBuffer, caracteres sumindo

4 respostas
dreamspeaker

Pessoas, cá estou eu envolvido na seguinte situação:

Eu tenho uma classe que recebe dados através de uma conexão Socket. Essa classe lê caracter por caracter que lhe é enviada, em buffers de 128 bytes, e "appenda" cada caracter em um StringBuffer, que mais a frente seu "toString()" é passado como parâmetro a outra classe, para os devidos tratamentos.

Eu recebo apenas letras, numeros e caracteres em branco (char = 32).

O que tá ocorrendo é o seguinte, vez por outra um determinado StringBuffer completo está "comendo" alguns caracteres em branco, gerando sequencias de Strings com 117, 121, 123... caracteres!

Exemplificando:

// strB = StringBuffer completo

// isso retorna 128, por exemplo
System.out.println(strB.length()); 

// isso retorna uma sequencia de caracteres com MENOS de 128 posições
System.out.println(strB.toString());

Não há caracteres especiais sendo "appendados" ao strB, e apenas caracteres em branco estão sendo "engolidos".

Eu não sei se há algum tipo de bug relacionado a versão 1.3.1....

java -version java version "1.3.1" Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.3.1-02b-FCS) Java HotSpot(TM) Client VM (build Blackdown-1.3.1_02b-FCS, mixed mode)

...., eu até gostaria de atualizar a versão, mas isso está fora do meu controle.

Alguma idéia? Já perdi algumas horas em cima disso..... :?

Valeu!

4 Respostas

Luca

Olá

Você recebe bytes ou chars? Presumo que receba array de bytes como deve ser. Então imprima o eco dos bytes que recebe e analise se o problema está na comunicação. As vezes a falta de um flush no lado que envia pode causar estragos na comunicação.

[]s
Luca

dreamspeaker

Oi, Luca.

Não, o problema não deve estar em falha na comunicação, porque o tamanho total da mensagem está correta. Se eu mando imprimir caracter por caracter antes de montar meu StringBuffer, todos aparecem corretamente.

Eu não entendi muito bem o que vc quis dizer com “Presumo que receba um array de bytes como deve ser”. Eu uso um BufferedReader para ler os dados, e da forma como está feito…

sock = new Socket(host, port); is = sock.getInputStream(); entrada = new BufferedReader(new InputStreamReader(is)); ............. char [] buffer = new char[128]; entrada.read(buffer, 0, 128);

… o método read(…) prevê leitura em um array de chars.

To fazendo alguma bobagem?

Valeu!

Luca

Olá

André, não sei bem se seu problema é este, mas sempre que vou ler e escrever sockets leio e escrevo bytes e nunca chars, Strings, doubles, etc.

[]s
Luca

T

Strings são strings, arrays de bytes são arrays de bytes, homens são homens e mulheres são mulheres - eu sei, eu sei, [size=“9”]existe uma cirurgia[/size] - oops, uma forma de converter Strings em arrays de bytes - e vice-versa, mas nunca fica perfeito.
Por exemplo, quando se converte um array de bytes em uma String, costuma haver alguns problemas com alguns bytes, que são convertidos para o valor ‘?’ em vez de algum caracter especial.
Quando se converte uma string para um array de bytes, alguns caracteres são convertidos para dois ou mais bytes, dependendo da codificação, ou simplesmente não conseguem ser convertidos corretamente (perdem-se).
Se você mistura as duas coisas, é como aqueles filmes mostrando colégios internos onde só estudavam meninas - dá sempre alguma confusão quando entram meninos. Você precisa saber exatamente o que está fazendo, e examinar cada byte e caracter para ver se a [size=“9”]cirurgia[/size] - perdão, a conversão funcionou direitinho ou não.
Isso dá o maior rolo em criptografia e em sockets, para listar dois lugares onde dá um monte de problemas confundir as duas coisas.

Criado 25 de setembro de 2004
Ultima resposta 27 de set. de 2004
Respostas 4
Participantes 3