Java 为什么在RESTlet中只能将表示转换为字符串一次?

Java 为什么在RESTlet中只能将表示转换为字符串一次?,java,rest,restlet,Java,Rest,Restlet,所以, 我正在尝试使用getText()或write()方法将表示转换为字符串或StringWriter。似乎我只能在表示上成功调用此方法一次。。。如果我再次调用该方法,它将在第二次调用时返回null或空字符串。为什么会这样?我希望它每次都会返回相同的内容: public void SomeMethod(Representation rep) { String repAsString = rep.getText(); // returns valid text for example:

所以, 我正在尝试使用getText()或write()方法将表示转换为字符串或StringWriter。似乎我只能在表示上成功调用此方法一次。。。如果我再次调用该方法,它将在第二次调用时返回null或空字符串。为什么会这样?我希望它每次都会返回相同的内容:

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?
}
public方法(表示代表)
{
String repAsString=rep.getText();//返回有效文本,例如:Hello WOrld
字符串repAsString2=rep.getText();//返回null…wtf?
}

如果我“做错了”,那么我愿意接受任何关于如何获取这些数据的建议。

javadocs对此进行了解释:

表示的内容可以是 如果存在错误,则多次检索 稳定且可访问的源,如 本地文件或字符串。当 表示是通过 像网络一样的临时源 套接字,其内容只能是 找回一次

所以推测它是直接从网络或类似的地方读取的


您可以通过调用
isTransient()
来检查这一点。如果您需要能够多次读取,那么您可能应该将其转换为字符串,然后从该字符串创建一个新的
表示。

javadocs对此进行了解释:

表示的内容可以是 如果存在错误,则多次检索 稳定且可访问的源,如 本地文件或字符串。当 表示是通过 像网络一样的临时源 套接字,其内容只能是 找回一次

所以推测它是直接从网络或类似的地方读取的


您可以通过调用
isTransient()
来检查这一点。如果您需要能够多次读取它,那么您可能应该将其转换为字符串,然后从该字符串创建一个新的
表示形式。

这是因为通常,在您使用getText()请求之前,表示形式实际上不会从InputStream中读取,并且在您请求之后,所有字节都已读取并转换为字符串

这是提高效率的自然实现:与创建一个可能非常大的字符串,然后将该字符串转换为有用的东西(JSON对象、DOM树或任何东西)不同,您可以编写转换器来操作InputStream,从而避免制作和读取该巨大字符串的成本

因此,例如,如果将一个大型XML文件放入web服务,则可以将InputStream直接送入SAX解析器


(正如@John所指出的,StringRepresentation包装了一个字符串,因此可以多次读取。但您必须读取请求的表示,这很可能是一个InputRepresentation。)

这是因为一般来说,在您使用getText()请求之前,表示实际上不会从InputStream读取,一旦你要求它,所有的字节都被读取并转换成字符串

这是提高效率的自然实现:与创建一个可能非常大的字符串,然后将该字符串转换为有用的东西(JSON对象、DOM树或任何东西)不同,您可以编写转换器来操作InputStream,从而避免制作和读取该巨大字符串的成本

因此,例如,如果将一个大型XML文件放入web服务,则可以将InputStream直接送入SAX解析器


(正如@John所指出的,StringRepresentation封装了一个字符串,因此可以多次读取。但您必须读取请求的表示,这很可能是一个InputRepresentation。)

很好的调查Jon。。。今晚我来试试看是否有效。多谢!很好,乔恩。。。今晚我来试试看是否有效。多谢!是的,我觉得这样做是为了提高效率。。。因为为每个调用创建一个巨大的字符串会很麻烦。是的,我认为这样做是为了提高效率。。。因为为每个调用创建一个巨大的字符串会很麻烦。