Java:处理URI中的特殊字符

时间:2016-10-27 09:38:14

标签: java url-encoding

我试图从URI访问文件,遗憾的是,该文件路径包含特殊名称。

  

例如:file:// C:/6-6+hf.1-181/db/mssql-ddl.sql

详细说明,下面是我的代码(scriptFile具有以上值):

File tempFile = FileUtility.fileFromUri(new URI(scriptFile));

哪个fileFromUri函数

public static File fileFromUri(URI uri) {
    try {
        if(uri.getScheme() == null) {
            uri = (new File(uri.getPath())).toURI();
        } else if(!uri.getScheme().equals("file")) {
            return null;
        }

        String fileName = uri.toURL().getFile();
        return new File(URLDecoder.decode(fileName, "UTF8"));
    } catch (Exception var2) {
        return null;
    }
}

我有这样的例外

  

java.io.FileNotFoundException:C:/6-6+hf.1-181/db/mssql-ddl.sql   (系统找不到指定的路径)   java.io.FileInputStream.open0(Native Method)〜[?:1.8.0_65] at   java.io.FileInputStream.open(FileInputStream.java:195)〜[?:1.8.0_65]     在java.io.FileInputStream。(FileInputStream.java:138)   〜[?:1.8.0_65]在java.io.FileReader。(FileReader.java:72)   〜[?:1.8.0_65] at   com.automic.actions.common.utils.FileUtility.readFileAsString(FileUtility.java:70)   〜[common-tool-develop-SNAPSHOT.jar:?] at   com.automic.actions.database.utils.SQLRunner.readStatementsFromFile(SQLRunner.java:117)   〜[classes /:?] at   com.automic.actions.database.utils.SQLRunner.executeScript(SQLRunner.java:91)   [classes /:?] at   com.automic.actions.database.SQLFeature.run(SQLFeature.java:302)   [classes /:?] at   com.automic.actions.common.FeatureRunner.run(FeatureRunner.java:24)   [common-tool-develop-SNAPSHOT.jar:?] at   com.automic.actions.runner.DatabaseToolFileCmd.main(DatabaseToolFileCmd.java:25)   [类/:?]

我知道这个例外是因为我之前使用过URLDecoder,在解码之后,Java翻译了' +'角色成为空间角色。解决方案可能只是取代' +'与他人的角色,然后再替换它。但是,我不想使用这种方法 那么你可以帮我解决这个问题吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

当你通过URI传递路径时,你应该首先编码它,如果你使用ajax,可能encodeURIComponent()方法是正确的。 像这样:

encodeURIComponent("file://C:/6-6+hf.1-181/db/mssql-ddl.sql")
//output
"file%3A%2F%2FC%3A%2F6-6%2Bhf.1-181%2Fdb%2Fmssql-ddl.sql"

如果你使用java URLEncode.encode(String str, String env)方法是正确的。

    String path = "file://C:/6-6+hf.1-181/db/mssql-ddl.sql";
    String path1 = URLEncoder.encode(path,"UTF-8");
    System.out.println(path1);
    String path2 = URLDecoder.decode(path1,"UTF-8");
    System.out.println(path2);

    //output
    file%3A%2F%2FC%3A%2F6-6%2Bhf.1-181%2Fdb%2Fmssql-ddl.sql
    file://C:/6-6+hf.1-181/db/mssql-ddl.sql