2010-07-20 3 views
0

에서 파일을 참조하는 방법 :나는 또한 패키지 X에서 패키지는 다음과 같이 Y 및 Z가, MyClassin 패키지 X를 자바 Pacakage

X - MyClass에
X - Y - 일부 파일
X - Z - 일부 파일

MyClass에서 Y 및 Z 패키지의 모든 파일 목록을 얻으려면 어떻게해야합니까?

+0

을 고려? – Maz

+0

기타 배경 : 테스트 메소드에서 루프 처리해야하는 여러 파일이 있습니다. 일부 파일은 Y 패키지에 있고 일부는 Z 패키지에 있습니다. 클래스 파일이 아니며 단지 데이터 파일입니다.패키지 Y와 패키지 Z의 모든 파일을 루프 할 수 있기를 원합니다. – Jon

답변

1

Java 패키지는 디렉토리 구조를 미러링합니다. File 클래스를 사용할 수 있습니다. 특히 listFiles() 방법을 참조하십시오.

편집

당신은 동적으로 실행 위치를 찾을 수 있습니다. 다음은 최근에 작업 한 프로젝트의 코드입니다. 내가 JAR을 실행하고있는 디렉토리 (JAR을 실행하고 있다면)를 찾을 수 있기를 원한다. 그렇지 않으면 의 JAR 파일을 클래스 파일에서 실행하고있다. 제 경우 JAR 파일은 <project root>/bin이고 수업은 <project root>/classes입니다.

final URL location; 
final String classLocation = JavaPlanner.class.getName().replace('.', '/') + ".class"; 
final ClassLoader loader = JavaPlanner.class.getClassLoader(); 

if(loader == null) 
{ 
    try { throw new ClassNotFoundException("class loaded with bootstrap loader"); } 
    catch (ClassNotFoundException cnfe) { throw new InitializationException(cnfe); } 
} 
else 
{ 
    location = loader.getResource(classLocation); 
} 

if(location.toString().startsWith("file:/")) // Line 14 
{ 
    // Running from .class file 
    String path; 
    try { path = URLDecoder.decode(location.toString().substring(6), "UTF-8"); } 
    catch(UnsupportedEncodingException uee) { throw new InitializationException(uee); } 

    // Move up package folders to root, add /bin/ 
    File package_ = new File(path).getParentFile(); 
    binPath = package_.getParentFile().getParentFile().getParentFile().getParentFile() + File.separator + "bin" + File.separator; 
} 
else // Line 25 
{ 
    // Running from .jar file 
    String jarURL = JavaPlanner.class.getResource("/" + JavaPlanner.class.getName().replaceAll("\\.", "/") + ".class").toString(); 
    jarURL = jarURL.substring(4).replaceFirst("/[^/]+\\.jar!.*$", "/"); 

    try 
    { 
     File dir = new File(new URL(jarURL).toURI()); 
     jarURL = dir.getAbsolutePath(); 
    } 
    catch(MalformedURLException mue) { throw new InitializationException(mue); } 
    catch(URISyntaxException use) { throw new InitializationException(use); } 

    binPath = jarURL; 
} 

14 번째 줄에는 클래스 파일에서 응용 프로그램을 실행하고있는 것으로 나타났습니다. String path은 처음에 JavaPlanner (내 main 메소드를 포함하는 클래스)의 파일 경로로 설정됩니다. 나는 JavaPlanner 패키지 구조를 알고 있으므로 getParentFile 적절한 수의 프로젝트 루트를 찾은 다음 bin /을 추가하십시오.

25 번 줄에서 JAR에서 응용 프로그램을 실행하고있는 것으로 나타났습니다. 블록은 실행 가능한 JAR이 들어있는 폴더의 경로를 가져옵니다.

분명히이 코드는 사용자의 목적에 맞게 100 % 수정 된 것은 아닙니다 (가장 구체적으로는 패키지 구조에 대해 특정 횟수만큼 getParentFile이라고 부릅니다).하지만 도움이 될 것 같습니다.

위의 코드의 목적은 내 응용 프로그램에 맞는 올바른 리소스 파일을 찾을 수있게하는 것이 었습니다. 프로덕션 버전에서는 JAR 만 사용할 수 있지만 일부 코드를 테스트 할 때마다 JAR을 다시 빌드하지 않으려 고했지만 리소스 파일 을 복제하지 않았습니다. 나는 빈/폴더를 클래스 파일로 오염시키고 싶지 않았다. 왜냐하면 bin /에있는 모든 것이 사용자에게 보내지기 때문이다.

+0

경로를 하드 코딩하지 않으려 고합니다. 내가 동적으로 경로를 찾을 싶습니다. – Jon

+0

@ 존 : 편집을 참조하십시오. 이전에 실행 위치와 관련된 특정 폴더를 찾기 위해 사용한 코드가 포함되어 있습니다. 도움이 될 것입니다. –

0

클래스의 소스에 따라 다릅니다. JAR 파일에있는 경우 JarFile 클래스를 사용하여 항목 목록을 얻을 수 있습니다.

+0

JAR 파일에 없으며 별도의 CLASS 파일 인 경우 Brian의 아이디어를 사용해야합니다. – Maz

+0

그들은 jar 파일이 아니며 java 파일이 아닌 데이터 파일입니다. – Jon

0
+0

기타 배경 : 테스트 방법에서 루프 할 때 필요한 여러 파일이 있습니다. 일부 파일은 Y 패키지에 있고 일부는 Z 패키지에 있습니다. 클래스 파일이 아니며 단지 데이터 파일입니다. 패키지 Y와 패키지 Z의 모든 파일을 반복 할 수 있기를 원합니다. – Jon