¿Por qué sólo puedo convertir una representación de una cadena de vez en Restlet?

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

  •  26-09-2019
  •  | 
  •  

Pregunta

Por lo tanto, Estoy tratando de convertir una representación de una cadena o una StringWriter ya sea usando el método getText () o escribir (). Parece que sólo puedo llamar a este método una vez con éxito en una representación ... Si yo llamo el método de nuevo, se devuelve un valor nulo o una cadena vacía en la segunda llamada. ¿Por qué es esto? Yo esperaría que retorne la misma cosa cada 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?
}

Si estoy "haciendo mal", entonces yo estaría abierto a cualquier sugerencia en cuanto a cómo puedo llegar a esos datos.

¿Fue útil?

Solución

Los javadocs explican esto:

  

El contenido de una representación puede ser   recuperado varias veces si hay una   fuente estable y accesible, como una   archivo local o una cadena. Cuando el   representación se obtiene a través de una   fuente temporal como una red   socket, su contenido sólo puede ser   recuperado una vez.

Por lo tanto es de suponer que está siendo leído directamente desde la red o algo similar.

Se puede comprobar esto llamando isTransient(). Si tiene que ser capaz de leer varias veces, es de suponer que debe convertirla en una cadena y luego crear una nueva Representation de esa cadena.

Otros consejos

Se debe a que, en general, la Representación en realidad no queda leer desde el InputStream hasta que la solicita con getText (), y una vez que has pedido, todos los bytes han sido leído y convertido en la cadena.

Esta es la aplicación natural para la eficiencia: en lugar de crear un potencial muy grande cadena y luego convertir esa cadena en algo útil (un objeto JSON, un árbol DOM, o lo que sea), se escribe su convertidor para operar en el InputStream vez , evitando los costes de fabricación y la lectura de ese enorme cadena.

Así, por ejemplo, si tiene un archivo XML grandes son puestos en un servicio web, se puede alimentar a la derecha InputStream en un analizador SAX.

(notas Como @ John, un StringRepresentation envuelve una cadena, y así se puede leer varias veces. Pero usted debe estar leyendo la representación de una solicitud, que es más probable un InputRepresentation.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top