2017-12-13 20 views
0

나는 이와 비슷한 주제를 찾을 수 있었지만 지금까지이 질문과 정확히 일치하는 것은 없습니다. 사용자가 응용 프로그램에 표시 할 이미지를 추가 할 수있는 JavaFX 응용 프로그램을 만들고 있습니다. 이러한 이미지는 텍스트 파일 데이터베이스에 파일 경로 문자열로 저장됩니다. .jar 파일은 읽기 전용이므로 이미지를 프로젝트에 직접 추가 할 수 없으므로 이미지가 모두 들어있는 프로젝트 바깥에있는 에셋 폴더를 만들었습니다.Java 내 프로젝트 위의 디렉토리에있는 파일에 액세스하는 방법

그래서 폴더 구조는 : 이제

-> Parent Folder that the .jar file sits in 
    - Project Folder or .jar file 
     - src 
      * classes.java 
    - assets Folder 
     * image.jpg 
     * image2.png 

, 내 imagePath 프로젝트 폴더 안에있는 경우 Image image = new Image(getClass().getResourceAsStream(imagePath));이 일 것이라는 점을 알고있다. 그러나 폴더 상대 경로 (외부)가 필요합니다.

내 첫 번째 (그리고 지금은 가장 중요한) 질문은 응용 프로그램의 폴더에서 빠져 나오는이 상대 경로를 어떻게 표시해야하는지입니다.

둘째로, 좋은 사례입니까? JavaFX 응용 프로그램을 만들고 응용 프로그램과 함께 저장할 새 이미지를 추가하려면 더 나은 방법이 있습니까?

+1

디렉토리에 대한 상대 경로로 파일 참조를 사용했습니다.이 문제는 디렉토리에있는 작업 디렉토리 변경 될 수 있습니다. 문제의 끝을 초래할 것입니다 – MadProgrammer

+0

_project directory_는 전혀 상관이 없습니다 - 여러분이 신경 쓰는 것은 _at_ runtime _ 프로그램의 _current 작업 디렉토리 _입니다. 프로그램이 실행될 때 이것은 일반적으로'../ '일 것이지만 MadProgrammer가 말한 것처럼 현재 디렉토리는 프로그램 실행 중에 바뀔 수 있습니다. –

+1

전반적인 더 나은 선택은 잘 알려진 위치 (사용자의'home' 디렉토리 아래)에 파일을 배치하는 것입니다. 특히 OS에 따라 다릅니다. 읽기 전용 자산을위한 더 나은 솔루션은 Jar 파일에 저장하는 것입니다. – MadProgrammer

답변

0

따라서 Getting the Current Working Directory in Java을 사용하여 항아리에서 벗어나는 경우 FileInputStream을 사용하여 Image을 얻을 수 있습니다. 예를 들면

String cwd = System.getProperty("user.dir"); 
File dirAboveCws = new File(cwd).getParentFile(); 
File[] imageFiles = dirAboveCws.listFiles(new FileFilter() { 
    @Override 
    public boolean accept(File pathname) { 
     return !pathname.getName().contains("jpg"); 
    } 
}); 

for (File imageFile : imageFiles) { 
    FileInputStream fileInputStream = new FileInputStream(imageFile); 
    Image image = ImageIO.read(fileInputStream); // Here is your image 
} 

지금까지 이미지 저장소가 현재 작업 디렉토리에 의존한다는 것은 좋은 생각입니다. IMO 사용자의 홈 디렉토리 (System.getProperty("user.home"))의 점 접두어로 된 하위 폴더를 사용하여 응용 프로그램 데이터를 저장해야합니다.

+0

고마워요! 둘 다 멋지게 작동하는 것처럼 보입니다.하지만 당신 말이 맞습니다. 파일 시스템의 맨 아래부터 시작하여 위쪽에 도달하려고 노력하는 것보다 더 현명한 방법입니다. 아무 것도 없는지 알지 못합니다! 그래서 나는 당신의 마지막 문장을 반영하도록 변했습니다. – officeface