문제

내 Java 앱에서는 파일과 디렉토리를 가져와야합니다.

이것은 프로그램 구조입니다.

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclass 내 리소스 (디렉토리 및 파일)를로드하는 리소스 로더 클래스를로드합니다.

파일에 관해서는 시도했습니다

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

실제 경로를 얻기 위해서는이 방법이 작동하지 않습니다.

디렉토리를 수행하는 방법은 모르겠습니다.

도움이 되었습니까?

해결책

로더를 얻는 클래스가 아니라 클래스 로더에 대한 경로를 공급하십시오. 예를 들어:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();

다른 팁

나는 사용하는 데 문제가있었습니다 getClass().getResource("filename.txt") 방법. Java Docs 지침을 읽으면 리소스가 리소스에 액세스하려는 클래스와 동일한 패키지에 있지 않은 경우에 따라 상대적인 경로를 제공해야합니다. '/'. 권장 전략은 리소스 파일을 루트 디렉토리의 "리소스"폴더 아래에 두는 것입니다. 예를 들어 구조가있는 경우 :

src/main/com/mycompany/myapp

그런 다음 Maven에서 권장하는 리소스 폴더를 추가 할 수 있습니다.

src/main/resources

또한 리소스 폴더에 하위 폴더를 추가 할 수 있습니다

src/main/resources/textfiles

파일이 호출되었다고 말합니다 myfile.txt 그래서 당신은 가지고 있습니다

src/main/resources/textfiles/myfile.txt

이제 바보 같은 길 문제가 발생하는 곳이 있습니다. com.mycompany.myapp package, 그리고 당신은 액세스하고 싶습니다 myfile.txt 리소스 폴더의 파일. 어떤 사람들은 당신이 다음을 주어야한다고 말합니다.

"/main/resources/textfiles/myfile.txt" path

또는

"/resources/textfiles/myfile.txt"

이 두 가지 모두 잘못되었습니다. 내가 달린 후 mvn clean compile, 파일과 폴더는 다음에 복사됩니다.

myapp/target/classes 

폴더. 그러나 리소스 폴더는 없으며 리소스 폴더의 폴더 만 있습니다. 그래서 당신은 다음과 같습니다.

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

그래서 올바른 길입니다 getClass().getResource("") 방법은 다음과 같습니다.

"/textfiles/myfile.txt"

여기있어:

getClass().getResource("/textfiles/myfile.txt")

이것은 더 이상 NULL을 반환하지 않지만 수업을 반환합니다. 나는 이것이 누군가를 돕기를 바랍니다. 나에게 이상하다 "resources" 폴더도 복사되지 않았지만 하위 폴더와 파일 만 직접 "resources" 폴더. 그것은 나에게 논리적으로 보일 것입니다 "resources" 폴더도 아래에서 찾을 수 있습니다 "myapp/target/classes"

다른 사람들만큼 빨리 선택하지 않는 사람들에게 추가 정보를 제공하기 위해 약간 다른 설정을 가지고 있기 때문에 시나리오를 제공하고 싶습니다. 내 프로젝트는 다음 디렉토리 구조 (Eclipse 사용)로 설정되었습니다.

Project/
  src/                // application source code
    org/
      myproject/
        MyClass.java
  test/               // unit tests
  res/                // resources
    images/           // PNG images for icons
      my-image.png
    xml/              // XSD files for validating XML files with JAXB
      my-schema.xsd
    conf/             // default .conf file for Log4j
      log4j.conf
  lib/                // libraries added to build-path via project settings

나는 자원을로드하는 데 문제가있었습니다 res 예배 규칙서. 모든 리소스가 소스 코드와 분리되기를 원했습니다 (단순히 관리/조직 목적). 그래서 내가해야 할 일은 res 에 대한 디렉토리 건축 경로 그런 다음 다음을 통해 리소스에 액세스하십시오.

static final ClassLoader loader = MyClass.class.getClassLoader();

// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");

노트: 그만큼 / 내가 사용하고 있기 때문에 리소스 문자열의 시작 부분에서 생략됩니다. classload.getResource (String) 대신에 class.getResource (String).

@GianCarlo : Java 프로젝트의 근본을 제공하는 System Property User.Dir를 호출 한 다음이 경로를 상대 경로로 추가하십시오.

String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt
String abspath = root+filepath;



// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);

클래스에서 'getResource'를 사용하면 클래스가있는 패키지에 따라 상대 경로가 해결됩니다. 클래스 로더에서 'getResource'를 사용하면 루트 폴더를 기반으로 상대 경로가 해결됩니다.

절대 경로를 사용하면 루트 폴더에서 'GetResource'메소드가 모두 시작됩니다.

Eclipse + Maven을 사용하는 사람들을 위해. 파일에 액세스하려고한다고 가정 해 봅시다 images/pic.jpg 안에 src/main/resources. 이렇게하면 :

ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());

완벽하게 정확하지만 널 포인터 예외가 발생할 수 있습니다. Eclipse는 Maven 디렉토리 구조의 폴더를 즉시 소스 폴더로 인식하지 못하는 것 같습니다. 제거하여 src/main/resources 프로젝트의 소스 폴더 목록에서 폴더를 다시 넣고 (프로젝트> 속성> Java 빌드 경로> 소스> 폴더 제거/추가)이를 해결할 수있었습니다.

resourcesloader.class.getClass()

다음으로 분류 할 수 있습니다.

Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();

즉, 부트 스트랩 클래스를 사용하여 리소스를로드하려고합니다.

대신 당신은 아마도 다음과 같은 것을 원할 것입니다.

resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

Javac만이 정적이 아닌 상황에서 정적 메소드를 호출하는 것에 대해 경고했다면 ...

다음 작업을 수행합니까?

resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")

패키지를 포함하여 전체 경로를 지정할 수없는 이유가 있습니까?

위에서 언급했듯이 두 가지 답변으로 이동합니다. 첫번째

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

하나가되어야합니까?

@jonathan.cone의 하나의 라이너를 작은 수정했습니다 (추가하여 .getFile() ) NULL 포인터 예외를 피하고 데이터 디렉토리로의 경로를 설정합니다. 저에게 효과가있는 것은 다음과 같습니다.

String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();

이것을 사용하십시오 :

resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**

파일에 대한 실제 경로를 얻으려면 다음을 시도 할 수 있습니다.

URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks");
String pathToClass = fileUrl.getPath;    

ResourcelOader는 여기에 클래스 이름입니다. "Resources/Repository/SSL-Key/Cert.jks"는 파일에 대한 상대적인 경로입니다. 나머지 폴더 구조가 남아있는 ./package1/java에 Guiclass를 가지고 있다면 상대 경로를 정의하는 규칙으로 인해 상대 경로로 "../resources/repository/ssl-key/cert.jks"를 가져갑니다.

이렇게하면 BufferedReader로 파일을 읽을 수 있습니다. 문자열을 사용하여 파일의 경로를 식별하지 마십시오. 경로에 영어 알파벳이 아닌 공백이나 일부 문자가있는 경우 문제가 발생하면 파일이 찾을 수 없습니다.

BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(fileUrl.openStream()));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top