在Java 1.4 InputStream上替换字符

时间:2011-03-04 20:08:48

标签: java parsing inputstream

我有一个正在返回的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”。

这样做的好方法是什么?

4 个答案:

答案 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();