在我的程序中,我进行了转换,如测试所示。 路径->文件-> URI-> URL->文件。
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.net.URI;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
@RunWith(JUnit4.class)
public class UrlStuffTest {
@Test
public void testFileToUriToUrlWithCreateFile() throws MalformedURLException, IOException {
Path p = Paths.get("testfolder", "xmls");
File f = p.toAbsolutePath().toFile();
f.mkdirs();
System.out.println(f);
URI uri = f.toURI();
System.out.println(uri);
URL url = uri.toURL();
System.out.println(url);
File aXmlFile = new File(url.getPath(), "test.xml");
System.out.println(aXmlFile);
aXmlFile.createNewFile();
}
@Test
public void testFileToUriToUrlWithCreateFileAndSpaceInPath() throws MalformedURLException, IOException {
Path p = Paths.get("test folder", "xmls");
File f = p.toAbsolutePath().toFile();
f.mkdirs();
System.out.println(f);
URI uri = f.toURI();
System.out.println(uri);
URL url = uri.toURL();
System.out.println(url);
File aXmlFile = new File(url.getPath(), "test.xml");
System.out.println(aXmlFile);
aXmlFile.createNewFile();
}
}
如果运行这些方法,您将看到上面的方法成功。最后一个在路径中有一个空格,在最后一行失败,基本上说“系统找不到路径...”。。
第一种方法的输出是
C:\ Development \ Workspace \ spielwiese \ testfolder \ xmls 文件:/ C:/ Development / Workspace / spielwiese / testfolder / xmls / 文件:/ C:/ Development / Workspace / spielwiese / testfolder / xmls / C:\ Development \ Workspace \ spielwiese \ testfolder \ xmls \ test.xml
第二种方法的输出是
C:\ Development \ Workspace \ spielwiese \ test文件夹\ xmls 文件:/ C:/ Development / Workspace / spielwiese / test%20folder / xmls / 文件:/ C:/ Development / Workspace / spielwiese / test%20folder / xmls / C:\ Development \ Workspace \ spielwiese \ test%20folder \ xmls \ test.xml
因此,从File转换为URI时,空格变为%20 。我想这就是导致最终XML文件创建失败的原因。
我通过使用File.toURL()
方法跳过了从文件到URI的转换,解决了程序中的这个问题。不过不推荐使用此方法。
什么是更好的解决方案?
答案 0 :(得分:0)
在将URL
字符串用作File
路径之前,您需要对其进行解码。像这样
String decodedUrlPath = java.net.URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.name());
答案 1 :(得分:-1)
真的很奇怪。有路径文件,没有URL / URI,它运行良好。试图找到其他提示,但也停留在此提示上:
Path path = Paths.get("test folder\\xmls", "test1.xml");
File aXmlFile = path.toFile();
System.out.println(aXmlFile);
aXmlFile.createNewFile();
所以我想在您的URI中,您必须将%20 pack替换为空格“”。
答案 2 :(得分:-1)
该代码有效:
aXmlFile = new File(url.getPath().replaceAll("%20", " "), "test.xml");
System.out.println(aXmlFile);
aXmlFile.createNewFile();