문제

Java에는 클래스 로더를 통해 항아리에서 검색된 리소스에 파일 인스턴스를 구성하는 방법이 있습니까?

내 응용 프로그램은 JAR (기본값) 또는 런타임 (사용자 입력)에 지정된 파일 시스템 디렉토리의 일부 파일을 사용합니다. 일관된 방법을 찾고 있습니다
a)이 파일을 스트림으로로드합니다
b) 사용자 정의 디렉토리 또는 항아리의 디렉토리에 파일을 나열

편집 : 분명히, 이상적인 접근 방식은 java.io.file을 완전히 멀리하는 것입니다. ClassPath에서 디렉토리를로드하고 해당 내용 (포함 된 파일/엔티티)을 나열하는 방법이 있습니까?

도움이 되었습니까?

해결책

ClassLoader.getResourceAsStream 그리고 Class.getResourceAsStream 리소스 데이터를로드하는 방법입니다. 그러나 나는 클래스 경로의 요소의 내용을 "나열"하는 방법이 없다고 생각합니다.

경우에 따라 이것은 단순히 불가능할 수 있습니다 - 예를 들어, ClassLoader ~할 수 있었다 어떤 리소스 이름을 요구하는지에 따라 즉시 데이터를 생성하십시오. 당신이 보면 ClassLoader API (기본적으로 ClassPath 메커니즘이 작동하는 것)는 원하는 것을 할 일이 없다는 것을 알 수 있습니다.

실제로 항아리 파일이 있다는 것을 알고 있다면로드 할 수 있습니다. ZipInputStream 사용 가능한 것을 찾으려면. 그래도 디렉토리 및 JAR 파일에 대한 코드가 다릅니다.

파일이 먼저 개별적으로 작성된 경우 하나의 대안은 사용 가능한 리소스 목록을 포함하는 일종의 매니페스트 파일을 포함하는 것입니다. JAR 파일에 해당 묶거나 파일 시스템에 파일로 포함시키고 사용자에게 리소스를 선택하기 전에로드하십시오.

다른 팁

나는 같은 문제가 있었고 다음을 사용할 수있었습니다.

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()

다음은 내 응용 프로그램 중 하나에서 약간의 코드가 있습니다 ... 귀하의 요구에 맞는지 알려주십시오. 사용하려는 파일을 알고 있다면이를 사용할 수 있습니다.

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

도움이되기를 바랍니다.

JAR에서 검색된 리소스에서 파일 인스턴스를 구성하는 신뢰할 수있는 방법은 리소스를 스트림으로 임시 파일로 복사하는 것입니다 (JVM이 종료 될 때 온도 파일이 삭제됩니다).

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

이 시도:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

더 많은 방법이 있습니다. 예를 들어 여기를 참조하십시오.http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

이것은 하나의 옵션입니다 : http://www.uofr.net/~ gret/java/get-resource-listing.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top