当前位置: 首页 > 知识库问答 >
问题:

Java“File”可以工作,但“InputStream”不能

安博文
2023-03-14

编辑:getResourceAsStream()与FileInputStream

这是我找到的最好的解释。就我个人而言,在尝试了InputStream的所有不同子类后,我觉得FileInputstream()返回的InputStream和getResourceAsStream()返回的InputStream的实现在某些方面略有不同(导致与javax.xml.parsers.不兼容)。

我会把这个打开一段时间,以防有人碰巧有答案,但我已经完成了。感谢所有的建议、建议和帮助。时间也转向下一件事。

我有一个servlet,它从一个XML ini文件中收集初始化数据,它从servlet会话上下文将其作为输入流打开,如下所示

   HttpSession session = request.getSession(true);
   ServletContext ctx=session.getServletContext();
   InputStream myini = ctx.getResourceAsStream("/WEB-INF/myini.xml");

这是可行的,但稍后我将编写JUnit测试和设置函数,我需要访问相同的ini。我在html" target="_blank">测试环境中没有servlet上下文,所以我尝试使用

InputStream testing = new FileInputStream(String pathToFile);

而且还

InputStream testing = new FileInputStream(File fileObj); 

XML解析器引发的异常(如下)

我发现不可能为我的init文件获取InputStream,因此不得不使用该文件。

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

但是我很困惑/很沮丧,所以我不得不问

为什么我可以使用“文件”返回一个文件对象,然后它可以被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个答案

曾弘扬
2023-03-14

getResourceAsStream()vs FileInputStream

这是我找到的最好的解释。就我个人而言,在尝试了InputStream的所有不同子类后,我觉得FileInputstream()返回的InputStream和getResourceAsStream()返回的InputStream的实现在某些方面略有不同(导致与javax.xml.parsers.不兼容)。

公冶伟
2023-03-14

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

我认为您可能希望尝试以下内容:

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

其中,系统ID被确定为文件。toURI()。Toasciisting()。

百里嘉泽
2023-03-14

您始终可以编写文件f=new File(“anyName”):即使文件不存在,它也不会引发异常。

然而,如果文件不存在,则写入输入流myini=new FileInputStream(“anyName”)将引发异常。

 类似资料:
  • 问题内容: 我试图在HashMap中找到一个键。我可以使用’get’打印选定的键,但是在if语句中使用’containsKey’时,找不到该键。 我知道该键存在于Map中,但它一直返回false。有什么想法的人吗? 我的代码: 这是Location类的代码: 问题答案: 您必须确保该类已正确实现其和方法(文档)。也就是说,如果两个对象实际上相等,则它们应该共享一个公共哈希码,并且它们的方法应该返回

  • 我希望使用一行String.split()拉出'名称'在查询我写... 模式匹配器像预期的那样工作,但是我正在努力找出为什么String.split()不返回匹配! 打印输出

  • 好吧,所以我得到了一个新的电脑 Windows 7 Pro 64位Service Pack 1 我安装了jdk-7U25-Windows-x64(jdk 1.7.0_25) 它安装在默认位置C:\program files\java\jdk1.7.0_25 我向Path环境变量添加了%java_home%\bin(是的,在添加之前我使用了;) 单击确定 关闭所有CMD窗口打开它们 现在,如果我运行

  • 正在更新属性文件:/home/mehmet/works/netbeansprojects/hsm_java/build/built-clean.属性删除目录/home/mehmet/works/netbeansprojects/hsm_java/build 清洁: 初始化: 已创建目录:/home///netbeansprojects/hsm_java/build/empty 已创建目录:/hom

  • 问题内容: 有什么方法可以从中创建对象吗? 我的要求是从RAR读取文件。我不是要写一个临时文件,而是要在RAR存档中找到一个文件。 问题答案: 您需要创建新文件并将内容复制到该文件: 我使用方便来避免手动复制流。它还具有内置缓冲。

  • 请求在Postman/Java中失败,但在RESTClient中工作…以下是请求,并附上错误的截图。 这是一个POST请求 {“username”:“test”,“password”:“test”,“simulate_user”:“test”,“sourcetabledesc”:“testlist100”,“联系人”:[{“组织”:“ckt”,“workphone”:“12315423”,“fir