为什么我只能在转换的Restlet表示为一个字符串一次?
题
所以, 我想表示转换为字符串或StringWriter的或者使用了gettext()或write()方法。看来我只能一次成功调用此方法上的表示......如果我再次调用该方法,则返回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?
}
如果我“做错了”,那么我会接受任何建议,我怎么能得到这些数据。
解决方案
的Javadoc解释这样的:
的表示的内容可以是 检索了几次,如果有一个 稳定的和可访问的来源,如 本地文件或字符串。当。。。的时候 表示通过获得 临时源等的网络 插座,其内容只能是 检索一次。
所以推测它被直接从网络或类似的东西读取。
您可以通过调用isTransient()
检查。如果您需要能够多次读它,想必你应该把它转换成字符串,然后创建从该字符串的新Representation
。
其他提示
这是因为一般的表象实际上并没有得到从InputStream直到你问它的getText()读取,并且一旦你自找的,所有的字节被读取并转换成字符串。
这是对效率的自然实现:而不是创建一个潜在的非常大的字符串,然后将这个字符串变成有用的东西(JSON对象,一个DOM树,或其他),你写你的转换器上的InputStream的操作,而不是,避免制造和读取巨大字符串的成本。
因此,举例来说,如果你有一个大的XML文件被放入一个Web服务,可以喂InputStream的权成SAX解析器。
(如@约翰注释,StringRepresentation包装一个String,所以可以多次读取,但你必须读请求的代表性,这是最有可能的InputRepresentation。)
不隶属于 StackOverflow