编辑:getResourceAsStream() vs FileInputStream
是我找到的最好的解释.就个人而言,尝试了InputStream的所有不同子类之后,我感到FileInputstream()返回的InputStream的实现和getResourceAsStream()返回的输入的实现在某种程度上略有不同(导致与javax.xml.parsers不兼容).
我会暂时打开此窗口,以防万一有人碰到一个答案,但是我已经完成了.感谢所有的建议,建议和帮助.时间也移到下一件事.
我有一个servlet,它从XML ini文件收集它的初始化数据,像这样从servlet会话上下文中将其作为InputStream打开.
HttpSession session = request.getSession(true);
ServletContext ctx=session.getServletContext();
InputStream myini = ctx.getResourceAsStream("/WEB-INF/myini.xml");
那行得通,但是稍后我要编写JUnit测试并在setup函数中,我需要访问相同的ini.我在测试环境中没有servlet上下文,所以我尝试使用创建一个InputStream
InputStream testing = new FileInputStream(String pathToFile);
并且
InputStream testing = new FileInputStream(File fileObj);
从XML解析器抛出的异常(如下)
我发现无法为我的初始化文件获取InputStream,而*使用File.
我检查了javadoc,在安全限制的情况下移动了文件位置.最终将双重构造函数添加到需要ini的类中,以接受File和InputStream以满足单元测试(这里我需要File ref)和运行时(其中InputStream从Servlet会话上下文返回)的需求.
但是我很困惑/很沮丧,所以我不得不问
如何使用“ File”返回文件对象,然后可以由javax.xml.parsers成功解析(请参见下面的函数)
File myini = new File("C:\\apache-tomcat-7.0.30\\myini\\myini.xml");
但是我不能使用“ InputStream”来做到这一点吗?
InputStream myini = new FileInputStream("C:\\apache-tomcat-7.0.30\\myini\\myini.xml");
使用完全相同的String路径(即文件存在)
每个分别传递给
public xmlNode parse(InputStream is) throws xmlException {
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
document = dBuilder.parse(is);
document.getDocumentElement().normalize();
xmlNode node = new xmlNode(document.getDocumentElement());
return node;
} catch (ParserConfigurationException e) {
throw new xmlException("Error in configuration of XML parser", e);
} catch (SAXException e) {
throw new xmlException("Error in parsing XML document", e);
} catch (IOException e) {
throw new xmlException("Error in reading InputStream", e);
}
}
要么
public xmlNode parse(File file) throws xmlException {
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
document = dBuilder.parse(file);
document.getDocumentElement().normalize();
xmlNode node = new xmlNode(document.getDocumentElement());
return node;
} catch (ParserConfigurationException e) {
throw new xmlException("Error in configuration of XML parser", e);
} catch (SAXException e) {
throw new xmlException("Error in parsing XML document", e);
} catch (IOException e) {
throw new xmlException("Error in opening file", e);
}
}
仅在调用InputStream方法时(如上所述进行适当的初始化之后),才会引发此异常.
xml.utils.xmlException: Error in reading InputStream
at xml.utils.xmlDocument.parse(xmlDocument.java:40)
at com.jcando.util.XMLini.<init>(XMLini.java:49)
是否有其他方法将路径定义为InputStream的字符串?
有我不知道的安全保护区吗?
如果有人可以解释我所缺少的,或者我在哪里变得笨拙,我将不胜感激.
解决方法:
您始终可以编写File f = new File(“ anyName”):即使该文件不存在,它也永远不会引发异常.
但是,如documentation所示,如果文件不存在,则编写InputStream myini = new FileInputStream(“ anyName”)会引发FileNotFoundException异常.