내 메인 클래스가 C:\Users\Justian\Documents\
. 내 프로그램이 안에 있음을 표시하려면 어떻게해야 C:\Users\Justian\Documents
합니까?
하드 코딩은 옵션이 아닙니다. 다른 위치로 옮길 경우 적응할 수 있어야합니다.
폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.
내 메인 클래스가 C:\Users\Justian\Documents\
. 내 프로그램이 안에 있음을 표시하려면 어떻게해야 C:\Users\Justian\Documents
합니까?
하드 코딩은 옵션이 아닙니다. 다른 위치로 옮길 경우 적응할 수 있어야합니다.
폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.
답변:
한 가지 방법은 시스템 속성 을 사용하는 System.getProperty("user.dir");
것입니다. 그러면 "속성이 초기화되었을 때 현재 작업 디렉터리"가 제공됩니다. 이것은 아마도 당신이 원하는 것입니다. 곳을 찾아 java
실제 .jar 파일이 컴퓨터에 다른 곳에 상주 할 수있는 경우에도 명령이 프로세스에 파일과 디렉토리에 귀하의 경우, 발행되었다. 실제 .jar 파일의 디렉토리를 갖는 것은 대부분의 경우 유용하지 않습니다.
다음은 .class 파일이있는 .class 또는 .jar 파일의 위치에 관계없이 명령이 호출 된 현재 디렉토리를 인쇄합니다.
public class Test
{
public static void main(final String[] args)
{
final String dir = System.getProperty("user.dir");
System.out.println("current dir = " + dir);
}
}
당신이있는 경우 /User/me/
와 위의 코드가 포함 된 .jar 파일이있는 /opt/some/nested/dir/
명령 java -jar /opt/some/nested/dir/test.jar Test
출력됩니다 current dir = /User/me
.
또한 좋은 객체 지향 명령 줄 인수 구문 분석기를 사용하는 것도 중요합니다. Java Simple Argument Parser 인 JSAP를 적극 권장 합니다. 이렇게 System.getProperty("user.dir")
하면 동작을 재정의하기 위해 다른 것을 사용 하고 대신 전달할 수 있습니다. 훨씬 더 유지 관리가 가능한 솔루션입니다. 이렇게하면 처리하기 위해 디렉토리를 전달하기가 매우 쉽고, user.dir
아무것도 전달되지 않으면 다시 사용할 수 있습니다 .
사용 CodeSource#getLocation()
. 이것은 JAR 파일에서도 잘 작동합니다. 당신은 얻을 수 CodeSource
로 ProtectionDomain#getCodeSource()
하고, ProtectionDomain
차례로 얻을 수 있습니다 Class#getProtectionDomain()
.
public class Test {
public static void main(String... args) throws Exception {
URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println(location.getFile());
}
}
OP의 의견에 따라 업데이트 :
폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.
이를 위해서는 프로그램에서 상대 경로를 하드 코딩 / 알고 있어야합니다. 대신 클래스 경로에 경로를 추가하여 사용할 수 있습니다.ClassLoader#getResource()
File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
@Override public boolean accept(File dir, String name) {
return name.endsWith(".csv");
}
});
또는 경로를 main()
인수 로 전달합니다.
getLocation()
메소드에 의해 반환 된 그대로 사용하십시오 . 다른 것들은 분명히 작동하지 않을 것입니다.
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());
다음과 같이 인쇄합니다.
/path/to/current/directory
/path/to/current/directory/.
참고 File.getCanonicalPath()
발생은 IOException가 확인하지만 같은 것들을 제거합니다 ../../../
방금 사용했습니다.
import java.nio.file.Path;
import java.nio.file.Paths;
...
Path workingDirectory=Paths.get(".").toAbsolutePath();
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
내가하면 /my/file
확실히 cwd가 아닙니다.
현재 소스 코드의 절대 경로를 원한다면 내 제안은 다음과 같습니다.
String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));
메인 클래스가 로컬 하드 디스크의 파일에 있다고 누가 말했습니까? 클래스는 종종 JAR 파일 내에 번들로 제공되며 때로는 네트워크를 통해로드되거나 심지어는 즉석에서 생성됩니다.
그래서 실제로하고 싶은 것은 무엇입니까? 클래스가 어디에서 왔는지에 대한 가정을하지 않는 방법이있을 것입니다.