这是一个代码行,我用它来访问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)
P.S。这100%不是文件访问的问题,因为我创建了一个生成JAXB类的简单项目,从资源文件夹解组相同的xml,一切正常。
这是一个项目结构:
答案 0 :(得分:3)
您已标记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")));