是否可以使用输入流读取http post值?

时间:2012-01-07 21:59:07

标签: java xml sax xerces

我是http将一个xml文件发布到servlet,目前正在执行:

String xmlString = request.getParameter("xml");

然后我在xml的SAX解析期间将xml字符串变量转换为StringReader和InputSource。

parser.parse(new InputSource(new StringReader(xmlString)));

我很好奇,如果我能以某种方式获得作为InputSource的值开始?

对于这一点而言,性能很重要,如果我可以避免,那么无缘无故地来回转换似乎毫无意义。

4 个答案:

答案 0 :(得分:4)

如果你的xml是一个参数,你就做不了多少。而且,正如JB Nizet和skaffman指出的那样,你不应该担心它。你只有一次在内存中,你只执行一次阅读。

但是如果xml是post body本身,那么你可以用:

来阅读它
parser.parse(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));

答案 1 :(得分:1)

你在这里没有转换任何东西。只需使用阅读器从原始字符串中读取,然后使用适配器将阅读器视为InputSource。与IO相比,这些操作绝对没有任何成本。

答案 2 :(得分:1)

实际上,使用HTTP发布文件的推荐方法是使用multipart/form-data(请查看此RFC-1867)。

使用它,您甚至可以发布多个文件,指定它们的mime类型及其编码 - 大多数答案都使用UTF-8 ......但是假设new StringReader(xmlString)几乎相同,这是非常危险的但有点错误,因为没有givin'任何编码都会将jvm回退留在'服务器'默认编码上。

为了处理这样的文件上传而没有框架的开销(例如Struts2 ......如果你愿意)是使用FileUpload apache lib。

他们建议使用经典API(rfc),但它们提供了另一个智能功能,可以直接使用stream ...

现在谈论解析,我的POV是使用连接中的阅读器和上传文件的mime-type(由FileUpload给出)。因此,通过FileUpload,您可以访问FileItem item.getContentType()InputStreamReader可以使用此constructor

帮助您创建{{1}}

修改

如果你想使用w / framework,甚至比Struts更进一步。这是我推荐阅读的内容,这是关于如何使用 Spring 3 updload proglyupload w/ Html

答案 3 :(得分:0)

您如何发送XML?是否可以将xml作为HTTP数据而不是HTTP参数发送?然后你应该能够将HttpInputStream重定向到一个InputSource,而不是从String中传递它。

但我认为从字符串读取会很快安静。只有当xmldata非常大时,才会出现性能问题,因为需要完全读取数据才能构造String。