2016-10-27 2 views
0

URI에서 파일에 액세스하려고합니다. 불행히도 파일 경로에 특별한 이름이 들어 있습니다.Java : URI의 특수 문자를 처리합니다.

예를 들어

: 파일 : //가 C : /6-6+hf.1-181/db/mssql-ddl.sql 상세

이 아래에있는 내 코드 (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; 
    } 
} 

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

입니다

어떤 617,451,515,

java.io.FileNotFoundException : C : java.io.FileInputStream.open0에서 /6-6+hf.1-181/db/mssql-ddl.sql (지정된 경로를 찾을 수 없습니다) (네이티브 메소드) ~ [? : 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 :] com.automic.actions.runner.DatabaseToolFileCmd.main (DatabaseToolFileCmd.java:25)에서 [클래스/:?]

내가 전에 URLDecoder를 사용했기 때문에이 예외는 것을 알고

하고, 디코딩 후, 자바는 '+'문자를 공간 문자. 해결책은 단지 '+'문자를 다른 문자로 대체 한 다음 나중에 대체 할 수 있습니다. 그러나 나는 그 접근법을 사용하고 싶지 않다.
다른 솔루션으로 도울 수 있습니까? 감사합니다.

+1

그래서 처음에는 제대로 인코딩되지 않은 URI가 있습니다. 그런 다음 해독하고 문제가 있습니다. 송신자 (권장)에서 제대로 인코딩해야하거나 디코딩을 조정해야합니다 (권장하지 않음). – eis

+0

어리석은 나는 다만, 나가 기능에 암호문을 풀기 전에 그것을 암호로하는 것을 잊었다는 것을 다만 깨닫는다. 내가 편집하고 제대로 작동합니다. 나 한테 수치! –

답변

0

URI를 통해 경로를 전달할 때 아약스를 사용하는 경우 먼저 인코딩해야합니다 (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" 

당신이 사용하는 경우 자바 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 
관련 문제