Java“文件”有效,但“InputStream”没有

时间:2013-07-17 16:05:41

标签: java inputstream fileinputstream

编辑:getResourceAsStream() vs FileInputStream

我找到了最好的解释。在尝试了InputStream的所有不同子类之后,我个人觉得FileInputstream()返回的InputStream的实现和getResourceAsStream()返回的实现在某种程度上略有不同(导致与javax.xml.parsers不兼容)。 p>

我会暂时保持这种状态,以防有人碰巧得到答案,但我已经完成了。感谢所有的建议,建议和帮助。时间也转移到下一件事。


我有一个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解析器抛出的异常(下面)

我发现无法为我的init文件获取InputStream并被迫使用File。

我检查了javadoc,在安全限制的情况下移动了文件位置。最终为需要ini的类添加了双构造函数,以接受File和InputStream以满足单元测试(我需要File ref)和运行时(从Servlet会话上下文返回InputStream)......

但我感到困惑/非常沮丧所以我不得不问

为什么我可以使用“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的字符串? 是否有一个我不知道的安全块?

如果有人可以解释我所缺少的东西,或者我作为一个树桩厚重的地方,我会很感激。

3 个答案:

答案 0 :(得分:2)

您始终可以编写File f = new File("anyName"):即使该文件不存在,也不会抛出异常。

然而,如果文件不存在,写InputStream myini = new FileInputStream("anyName")会抛出FileNotFoundException例外,如documentation所示。

答案 1 :(得分:1)

我怀疑您可能有一个字符编码错误或与解析文档中的相对网址相关的错误(虽然我不确定这是否会导致异常)。

我认为您可能希望尝试以下方式:

InputSource source = new InputSource(is);
source.setEncoding(... your character encoding ...);
source.setSystemId(systemId);
dBuilder.parse(inputSource);

systemId被确定为file.toURI().toASCIIString()

答案 2 :(得分:0)

getResourceAsStream() vs FileInputStream

我找到了最好的解释。在尝试了InputStream的所有不同子类之后,我个人觉得FileInputstream()返回的InputStream的实现和getResourceAsStream()返回的实现在某种程度上略有不同(导致与javax.xml.parsers不兼容)。 p>