这是代码行,我用它来访问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,并且一切正常。
这是项目的结构:
最佳答案
您已标记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")));