2017-10-30 14 views
0

내가 클래스 패스에 자원으로 사용할 수있게 한 파일에서 읽으려고 해요를 찾을 수 없습니다 전체 경로를 통해 리소스에 절대적으로 액세스하고 스트림 및 작업 표시로 액세스합니다.는 JAR의 클래스 패스 자원</p> <pre><code>FileInputStream serviceAccount = new FileInputStream("firebase-service-account.json"); </code></pre> <p>내가 해봤 (해당 파일 또는 디렉터리)

enter image description here

를 그리고 나는 그들이 스트리밍되는 있다면 확실하지 않다하더라도, 나는 자원이 제대로 번들로 제공되는 것을 볼 수있는 JAR을 열 균열 때

내 목표 파일 구조는 다음과 같습니다.

enter image description here

가 어떻게 내 리소스에 액세스 할 수 있습니까?

Exception in thread "main" java.io.FileNotFoundException: [email protected] (No such file or directory) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.io.FileInputStream.<init>(FileInputStream.java:93) 
at com.lumos.xlsx_manager.es.da.Firebase.main(Firebase.java:146) 
+1

당신은 FileInputStream에이 결과 자원이 JAR 파일 내부에 원인이 사용할 수 없습니다. 당신은'this.getClass(). getResourcesAsStream (".../File.properties")'..'를 사용해야합니다. – khmarbaise

+0

이것은 효과가 있었는데, 이유를 설명해 주시겠습니까? – Simmeringc

+0

'src/main/resources' 위치는 최종 jar 파일에 패키지됩니다. 즉, File ...을 통해 액세스 할 수 없다는 것을 의미합니다. 따라서'class.getResourcesAsStream()'을 사용해야합니다. 클래스 패스뿐만 아니라 병 안에 .... – khmarbaise

답변

0

당신은 당신 만 특별히 FileInputStream InputStream 인하지를 필요로 가정하고, 이런 식으로 뭔가를 시도 할 수 있습니다 :

InputStream serviceAccount = null; 
try{ 
    File f = new File("firebase-service-account.json"); 
    if (f.exists()){ 
     serviceAccount = new FileInputStream(f); 
    } else { 
     URL url = this.getClass().getResource("firebase-service-account.json"); 
     serviceAccount = url.openConnection().getInputStream(); 
    } 

    //Now do whatever you are doing with the InputStream... 

    }catch (Exception e){ 
     e.printStackTrace(); 
    } finally{ 
     if (serviceAccount != null) { 
      try { 
       serviceAccount .close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

JAR 파일을 찾을 수 없습니다. 위의 Khmarbaise의 제안이 효과가있었습니다! – Simmeringc

+0

이것은 매우 이상합니다. Class의 소스 코드를 검사하면 ClassLoader에서 같은 이름의 메서드에 위임된다는 점에서 두 메서드가 동일합니다. 결과적으로 URL이 null이 아닌 경우 ClassLoader # getResourceAsStream()은 결과적으로'ClassLoader # getResource()'를 호출 한 다음 결과 URL에'url.openStream()'을 호출합니다 (그리고 이것은 여러 곳에서 사용했던 코드입니다. 파일 이름/변수 이름 포함)! http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Class.java#Class.getResourceAsStream%28java.lang.String%29 및 링크 거기에 소스에 대한 – SteveR

+0

사실, 내 코드 스 니펫 __does__에있는 파일'f'가 동일한 패키지에 있기 때문에 존재하지만, FileInputStream은이 경로에 접근 할 수 없다. getClass(). getResource() 경로를 고수해야합니다. – SteveR