2014-03-05 3 views
1

따라서 프로젝트 구조는 다음과 같습니다. jar 파일 (이름이 patch.jar) 및 리소스 폴더.jar 파일 내부의 클래스는 jar 파일 외부의 파일을 읽습니다.

그래서 jar 파일에는 클래스 (patch.class)가 있습니다.

리소스 폴더에는 하위 폴더 (scripts)가 있고 하위 폴더에는 코드를 읽고 싶은 파일 (patch.file)이 있습니다.

이상한 점은 상대 경로를 설정하면 코드를 읽을 수 없지만 경로없이 파일 이름을 설정하면 작동합니다.

File a = new File("./resource/scripts/patch.file"); //not work 

File a = new File("./patch.file"); //works 

정말 혼란스러워하고 있습니다.

+0

상대 경로는 * (프로그램이 호출 된 방법에 따라) 아무것도 * 할 수있는 프로그램의 "현재 디렉토리"를 기준으로 기억 : 그 작업을 수행하려면, 다음과 같이해야합니다. 프로그램의 루트 디렉토리라고 가정 할 수 없으므로 이와 같은 상대 경로를 하드 코딩하는 것은 좋지 않은 아이디어입니다. – Wyzard

+0

@Wyzard 감사합니다. 매우 도움이됩니다. – aken848

답변

1

병이 있다는 사실은 부적절합니다. 중요한 것은 현재 디렉토리 (사용자가 pwd을 실행할 때 얻는 파일)과 관련된 파일의 위치입니다. 디렉터리 /Home/aken에있어,하고 명령을

less ./resources/scripts/patch.file 

을 실행하면 그것은 열고 파일 /Home/aken/resources/scripts/patch.file을 표시하려고합니다.

Java의 상대 파일 경로에서도 마찬가지입니다. 디렉터리 /Home/aken에있어, 그리고

java -cp patch.jar patch 

을 실행하고 클래스의 코드가

new File("./resource/scripts/patch.file"); 

를 사용하는 경우 다음 자바 파일 /Home/aken/resources/scripts/patch.file을 열려고합니다. 당신은 /foo/bar에있어 및

java -cp /Home/aken/patch.jar patch 

다음 자바가 /foo/bar입니다 현재 디렉토리에 파일 상대를 검색합니다 명령을 실행

합니다. 그러면 파일 /foo/bar/resources/scripts/patch.file이 열립니다.

0

File("...")의 상대 경로는 프로세스의 작업 디렉토리와 관련이 있습니다. File("some/path/file.txt")이 작동하거나 그렇지 않으면 파일 some/path/file.txt이 Java 프로세스가 실행되는 디렉토리에 상대적인 파일 시스템에 존재하거나 존재하지 않기 때문입니다. 명령 줄에서 실행하는 경우이 경로는 현재있는 디렉토리에 대한 상대 경로입니다.

을 사용하여 jar 파일을 참조 할 수 없습니다.

InputStream is = this.getClass().getResourceAsStream("some/path/file.txt");