【问题标题】:Java: handle special character in URIJava:处理 URI 中的特殊字符
【发布时间】:2017-10-28 18:30:03
【问题描述】:

我正在尝试从 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] 在 com.automic.actions.common.utils.FileUtility.readFileAsString(FileUtility.java:70) ~[common-tool-develop-SNAPSHOT.jar:?] 在 com.automic.actions.database.utils.SQLRunner.readStatementsFromFile(SQLRunner.java:117) 〜[类/:?]在 com.automic.actions.database.utils.SQLRunner.executeScript(SQLRunner.java:91) [课程/:?] 在 com.automic.actions.database.SQLFeature.run(SQLFeature.java:302) [课程/:?] 在 com.automic.actions.common.FeatureRunner.run(FeatureRunner.java:24) [common-tool-develop-SNAPSHOT.jar:?] 在 com.automic.actions.runner.DatabaseToolFileCmd.main(DatabaseToolFileCmd.java:25) [类/:?]

我知道这个异常是因为我之前使用过 URLDecoder,解码后,Java 将“+”字符转换为空格字符。解决方案可能只是用其他字符替换“+”字符,然后再替换它。但是,我不想使用这种方法。
那么你能帮我解决这个问题吗? 非常感谢!

【问题讨论】:

  • 所以你有一个最初没有正确编码的uri,然后你解码它并遇到问题。要么您需要在发件人上正确编码(推荐),要么您必须调整解码(不推荐)。
  • 愚蠢的我,才意识到我在函数解码之前忘记了编码。我编辑了它,它工作正常。真丢人!!

标签: java url-encoding


【解决方案1】:

当你通过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"

如果你使用javaURLEncode.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多