将文件对象转换为路径包含空格的URI对象

时间:2019-06-13 16:20:44

标签: java

在我的程序中,我进行了转换,如测试所示。 路径->文件-> 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的转换,解决了程序中的这个问题。不过不推荐使用此方法。

什么是更好的解决方案?

3 个答案:

答案 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();