Java 为什么在RESTlet中只能将表示转换为字符串一次?
所以, 我正在尝试使用getText()或write()方法将表示转换为字符串或StringWriter。似乎我只能在表示上成功调用此方法一次。。。如果我再次调用该方法,它将在第二次调用时返回null或空字符串。为什么会这样?我希望它每次都会返回相同的内容: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:
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。。。今晚我来试试看是否有效。多谢!很好,乔恩。。。今晚我来试试看是否有效。多谢!是的,我觉得这样做是为了提高效率。。。因为为每个调用创建一个巨大的字符串会很麻烦。是的,我认为这样做是为了提高效率。。。因为为每个调用创建一个巨大的字符串会很麻烦。