Java: 处理 URI 中的特殊字符
Java: handle special character in URI
我正在尝试从 URI 访问文件,不幸的是,该文件路径包含特殊名称。
For example: 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
(The system cannot find the path specified) at
java.io.FileInputStream.open0(Native Method) ~[?:1.8.0_65] at
java.io.FileInputStream.open(FileInputStream.java:195) ~[?:1.8.0_65]
at java.io.FileInputStream.(FileInputStream.java:138)
~[?:1.8.0_65] at 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)
[classes/:?]
我知道这个异常是因为我之前用过URLDecoder,解码后,Java将'+'字符翻译成space字符。解决方案可能只是将“+”字符替换为其他字符,然后再替换它。但是,我不想使用那种方法。
那么你能帮我解决这个问题吗?
非常感谢!
当你通过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
我正在尝试从 URI 访问文件,不幸的是,该文件路径包含特殊名称。
For example: 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 (The system cannot find the path specified) at java.io.FileInputStream.open0(Native Method) ~[?:1.8.0_65] at java.io.FileInputStream.open(FileInputStream.java:195) ~[?:1.8.0_65] at java.io.FileInputStream.(FileInputStream.java:138) ~[?:1.8.0_65] at 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) [classes/:?]
我知道这个异常是因为我之前用过URLDecoder,解码后,Java将'+'字符翻译成space字符。解决方案可能只是将“+”字符替换为其他字符,然后再替换它。但是,我不想使用那种方法。
那么你能帮我解决这个问题吗?
非常感谢!
当你通过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