这是代码行,我用它来访问xml文件。

Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new File(classLoader.getResource("Contacts.xml").getFile())));


这是我进行战争时得到的:

java.io.FileNotFoundException: file:\D:\apache-tomcat-8.0.50\webapps\pb\WEB-INF\lib\phonebook-server-0.0.1-SNAPSHOT.jar!\Contacts.xml (The filename, directory name, or volume label syntax is incorrect)


附言这不是100%的文件访问问题,因为我做了一个简单的项目,该项目生成JAXB类,从资源文件夹解组相同的xml,并且一切正常。

这是项目的结构:

java - 进行 war 时出现FileNotFoundException-LMLPHP

最佳答案

您已标记spring,因此我认为您可以使用它。

部署后(例如通过Tomcat),您的战争是否会解散?

如是,

使用ClassPathResource#getFile()

您的问题是getFile()返回的字符串。它包含一个感叹号(!)和一个file:协议。您可以自己处理所有事情,并为此实现自己的解决方案,但这将彻底改变方向。

幸运的是,Spring有一个org.springframework.core.io.ClassPathResource。要获取文件,只需写new ClassPathResource("filename").getFile();,您需要替换

Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new File(classLoader.getResource("Contacts.xml").getFile())));




Contacts contactsEntity = (Contacts) um.unmarshal(new FileReader(new ClassPathResource("Contacts.xml").getFile()));


现在,您的程序在部署和解压缩后也应该可以运行。

如果没有(建议,如果不确定,请使用此选项),

您必须使用InputStream,因为该资源在文件系统上并不作为文件存在,而是打包在档案文件中。

这应该工作:

Contacts contactsEntity = (Contacts) um.unmarshal(new InputStreamReader(new ClassPathResource("Contacts.xml").getInputStream()));


(没有春季):

Contacts contactsEntity = (Contacts) um.unmarshal(new InputStreamReader(classLoader.getResourceAsStream("Contacts.xml")));

10-08 10:59