我有一个正在返回的InputStream,例如:
<?xml version='1.0' ?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><bbs:rule xmlns:bbs="http://com.foo/bbs">
然后我将流传递给返回字节数组的方法。 在传递给byte []方法之前,我想用“org.bar”代替“com.foo”。
这样做的好方法是什么?
答案 0 :(得分:1)
一种方法是将InputStream包装在您自己的FilterInputStream子类中,该子类即时进行转换。它必须是一个前瞻流,检查每个“c”字符,看它后面是否是“om.foo”,如果是,则进行替换。您可能只需要覆盖read()
方法。
答案 1 :(得分:1)
如果你有一个bytearray,你可以将它转换为String。注意编码,在我使用utf-8的例子中。我认为这是一种简单的方法:
String newString = new String(byteArray, "utf-8");
newString = newString.replace("com.foo", "org.bar");
return newString.getBytes("utf-8");
答案 2 :(得分:1)
流读/写字节。试图用二进制表示替换文本是一件麻烦事。因此,要做的第一件事就是将此流包装到Reader(如InputStreamReader)中,该Reader将负责将二进制数据转换为字符信息。但是,您必须知道流数据的编码,以确保正确解释它。例如,UTF-8或ISO-8859-1。
获得文本数据后,您可以考虑如何替换部分文本数据。一种方法是使用正则表达式。但是,这意味着您首先必须将整个流读入字符串,执行替换然后返回字节数组。对于大量数据,这可能效率低下。
由于您正在处理XML数据,因此您可以使用更高级别的方法并以某种方式解析XML,从而允许您处理内容而无需将它们完全以中间格式存储。使用您自己的ContentHandler的SAXParser可以解决这个问题。当事件到达时,只需将它们再次写出来,但要进行适当的更改。另一种方法是使用一些扩展函数魔术进行XSLT转换。
在java.nio中是不是应该支持像这样的流操作?或者这是否计划用于即将推出的Java版本?
答案 3 :(得分:0)
这可能不是最有效的方法,但它确实有效。
InputStream is = // input;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(baos));
String line = null;
while((line = reader.readLine()) != null)
{
if(line.contains("com.foo"))
{
line = line.replace("com.foo", "org.bar");
}
writer.write(line);
}
return baos.toByteArray();