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

编辑: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异常.

上一篇:Java I / O-重用InputStream对象


下一篇:try(){}使用