gpt4 book ai didi

java - JAXB 无法加载名称包含 URL 编码字符的文件

转载 作者:行者123 更新时间:2023-12-02 10:23:40 25 4
gpt4 key购买 nike

我有一个文件,其路径如下所示:/home/jwayne/test/55-0388%25car.xml。我尝试使用 JAXB 将 XML 解码回对象,如下所示。

File file = new File("/home/jwayne/test/55-0388%25car.xml");
JAXBContext context = JAXBContext.newInstance(Rectangle.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Rectangle rectangle = (Rectangle) unmarshaller.unmarshal(file);

但是,我收到 FileNotFoundException (FNFE),其堆栈跟踪如下。

[java.io.FileNotFoundException: /home/jwayne/test/55-0388%car.xml (No such file or directory)]    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:246)    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)...

Note that somehow (as suggested by the stacktrace), the unmarshaller has modified the file name from 55-0388%25car.xml to 55-0388%car.xml.

Stepping through the code, however, the problem is actually pretty deep: sun.net.www.protocol.file.Handler has a method openConnection that does the following.

File var4 = new File(ParseUtil.decode(var1.getPath()));

sun.net.www.ParseUtil.decode 方法实际上会转换文件路径。

关于如何快速解决此问题(除了重命名文件)有什么想法吗? (请注意,我使用的是 JDK v1.8.0_191)。

最佳答案

问题的根本原因是有一个 % 用于 URL 编码特殊字符。对于 % 来说,它是 %25

JAXB 内部所做的是将 %25 解码为纯 %,因此无法找到该文件。

快速(但肮脏)的解决方案是进行一些字符串替换,例如:

String fileName = "/home/jwayne/test/55-0388%25car.xml": 
fileName = fileName.replace("%25", "%2525");
File file = new File(fileName);

只要文件名中包含 %25,此规则就适用。但我猜任何 URL 编码的字符都会发生这种情况。因此,如果有任何其他特殊字符,您需要对每个或一些巧妙的正则表达式解决方案进行一些处理。

更新:

要解决此 JAXB 行为,请为其提供 InputStream 而不是 File。就像这样:

FileInputStream fis = new FileInputStream(fileName);        
Rectangle r2 = (Rectangle) unmarshaller.unmarshal(fis);

那么 JAXB 就无法更改任何 URI/文件名。

关于java - JAXB 无法加载名称包含 URL 编码字符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54139165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com