Por que só posso converter uma representação em uma string uma vez em RestLet?

StackOverflow https://stackoverflow.com/questions/3818801

  •  26-09-2019
  •  | 
  •  

Pergunta

Então, estou tentando converter uma representação em uma string ou um stringwriter usando o método getText () ou write (). Parece que só posso chamar esse método uma vez com sucesso em uma representação ... se eu ligar para o método novamente, ele retorna string nula ou vazia na segunda chamada. Por que é isso? Eu esperaria que ele voltasse a mesma coisa toda vez:

public void SomeMethod(Representation rep)
{
    String repAsString = rep.getText();  // returns valid text for example: <someXml>Hello WOrld</someXml>

    String repAsString2 = rep.getText(); // returns null...  wtf?
}

Se eu estiver "fazendo errado", estaria aberto a qualquer sugestão de como posso chegar a esses dados.

Foi útil?

Solução

Os javadocs explicam isso:

O conteúdo de uma representação pode ser recuperado várias vezes se houver uma fonte estável e acessível, como um arquivo local ou uma string. Quando a representação é obtida através de uma fonte temporária como um soquete de rede, seu conteúdo só pode ser recuperado uma vez.

Então, presumivelmente, ele está sendo lido diretamente da rede ou algo semelhante.

Você pode verificar isso ligando isTransient(). Se você precisar lê -lo várias vezes, presumivelmente você deve convertê -lo em uma string e depois criar um novo Representation daquela string.

Outras dicas

É porque, em geral, a representação não é realmente lida no InputStream até que você o peça com getText () e, depois de solicitar, todos os bytes foram lidos e convertidos na string.

Esta é a implementação natural da eficiência: em vez de criar uma corda potencialmente muito grande e depois converter essa string em algo útil (um objeto JSON, uma árvore dom ou qualquer outra coisa), você escreve seu conversor para operar no InputStream, evitando o Custos de fazer e ler essa corda enorme.

Por exemplo, se você tiver um grande arquivo XML sendo colocado em um serviço da Web, poderá alimentar o inseto de entrada direto em um analisador sax.

(Como @john observa, uma StringRepresentation envolve uma string e, portanto, pode ser lida várias vezes. Mas você deve estar lendo a representação de uma solicitação, o que provavelmente é uma apresentação de entrada.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top