Java 프로젝트의 상대 경로에서 파일을 읽는 방법은 무엇입니까? java.io.File이 지정된 경로를 찾을 수 없습니다.


113

2 개의 패키지가있는 프로젝트가 있습니다.

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

패키지 (2)에는 텍스트 파일 ListStopWords.txt이 있고 패키지 (1)에는 클래스가 FileLoadder있습니다. 다음은 코드입니다 FileLoader.

File file = new File("properties\\files\\ListStopWords.txt");

그러나 다음과 같은 오류가 있습니다.

The system cannot find the path specified

그것을 고칠 해결책을 줄 수 있습니까? 감사.


12
두 패키지 예는 동일합니다. 당신은 의미하지 않는다 properties.files에 대해 2?
BalusC 2010 년

답변:


173

이미 클래스 경로에있는 경우 디스크 파일 시스템 대신 클래스 경로에서 가져옵니다. .NET에서 상대 경로를 조작하지 마십시오 java.io.File. Java 코드 내부에서 완전히 제어 할 수없는 현재 작업 디렉토리에 의존합니다.

클래스 ListStopWords.txt와 동일한 패키지에 있다고 가정하고 FileLoader다음을 수행하십시오.

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

또는 궁극적으로 추구하는 것이 실제로 그 InputStream중 하나 인 경우 :

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

는 디스크 파일 시스템 경로를 나타내지 않을 수도 있지만 가상 파일 시스템 경로를 나타낼 수도 new File()있기 때문에 를 만드는 것보다 확실히 선호 url됩니다 (JAR가 디스크 파일 시스템의 임시 폴더가 아닌 메모리로 확장 될 때 발생할 수 있음). 또는 File생성자가 정의 할 수없는 네트워크 경로도 있습니다.

파일이-패키지 이름 힌트로서- 실제로 "잘못된"확장자를 가진 완전한 속성 파일 ( key=value줄 포함 ) 인 경우 InputStream즉시 load()메소드에 를 공급할 수 있습니다.

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

참고 : static컨텍스트 내부 에서 액세스하려는 경우 위의 예 대신 FileLoader.class(또는 무엇이든 YourClass.class) 사용하십시오 getClass().


FileLoader가 Java에서 제거 되었습니까? 나는 정적 컨텍스트 (Java 6)에서 이것을하려고하는데 그것을 가져올 방법을 찾을 수 없으며 유형으로 해결할 수 없다는 메시지가 계속 표시됩니다. 이상하게도 입력하면서 자동 완성되었지만 오류가 발생했습니다.
turbo

2
오, ClassLoader.class이어야합니다.
turbo

4
@turbo : FileLoaderOP의 사용자 정의 클래스입니다. 리소스를 얻으려는 클래스와 정확히 일치해야합니다. 따라서 NameOfYourCurrentClass.class.getResourceAsStream(...). 는 ClassLoader.class경우 생성 실패 ClassLoader클래스 (자바 EE 웹 응용 프로그램 등) 여러 클래스 로더의 계층 구조를 가진 "기업"응용 프로그램에서 발생할 수있는 다른 클래스 로더에 의해로드되고있다.
BalusC 2013 년

오, 알겠습니다. 나는 그것이 의존적이라는 것을 이해하지 못했습니다. 정리해 주셔서 감사합니다!
turbo

10
파일이 동일한 패키지에 없는지에 대한 제안 사항이 있습니까? 제 경우에는 테스트 패키지에있는 파일을 열려고합니다.
Robin Newhouse 2014 년

44

파일의 상대 경로를 지정하려는 경우 다음 행을 사용할 수 있습니다.

File file = new File("./properties/files/ListStopWords.txt");  

3
경로 사이에 왜 3 개의 슬래시가 있는지 알 수 있습니다.
MSNaidu 2014

오류 :> 문자열 리터럴에 잘못된 이스케이프 문자가 있습니다.
IgorGanapolsky

이것을 어떻게 변환 InputStream합니까?
IgorGanapolsky

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
카메론 허드슨

42

상대 경로는. 운영자.

  • . 현재 실행중인 컨텍스트와 동일한 폴더를 의미합니다.
  • ..은 현재 실행중인 컨텍스트의 상위 폴더를 의미합니다.

그래서 문제는 자바가 현재 찾고있는 경로를 어떻게 아는가?

작은 실험을하다

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

출력을 관찰하면 Java가 찾고있는 현재 디렉토리를 알 수 있습니다. 거기에서 ./ 연산자를 사용하여 파일을 찾으십시오.

예를 들어 출력이

G : \ JAVA8Ws \ MyProject \ content.

파일은 MyProject 폴더에 있습니다.

File resourceFile = new File("../myFile.txt");

도움이 되었기를 바랍니다


이 답변을 검색 한 후 몇 시간 동안 해결책을
찾았습니다

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky는 클래스의 이름입니다. .class클래스의 전체 이름을 제공해야만 리터럴을 참조 할 수 있습니다 .
Tomasz Mularczyk

나는 그것이 FileLoader가 될 것이라고 생각합니다.
jamesdeath123


5

나는 댓글을 달 수 있었지만 그에 대한 담당자가 적습니다. Samrat의 대답이 나를 위해 일했습니다. 다음 코드를 통해 현재 디렉토리 경로를 보는 것이 좋습니다.

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

프로젝트에서 직면 한 문제를 바로 잡는 데 사용했습니다. ./를 사용하여 현재 디렉토리의 상위 디렉토리로 돌아 가야합니다.

    ./test/conf/appProperties/keystore 

Tomcat을 통해 코드를 실행하고 있으므로 현재 디렉터리가 프로젝트 폴더가 아닙니다. 프로젝트 루트에 대한 상대 경로를 어떻게 정의합니까? 현재 하드 경로를 사용하고 있습니다 : "C : \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli

@TiagoRedaelli이 질문을 확인하십시오 : stackoverflow.com/questions/12843217/…
dezible

4

BalusC에서 제공하는 답변은이 경우에 작동하지만 파일 경로에 공백이 포함 된 경우 URL이 유효한 파일 이름이 아닌 % 20으로 변환되기 때문에 중단됩니다. 문자열이 아닌 URI를 사용하여 File 객체를 생성하면 공백이 올바르게 처리됩니다.

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

src / main // js / Simulator.java 내부에서 'command.json'을 구문 분석하고 싶었습니다. 이를 위해 src 폴더에 json 파일을 복사하고 다음과 같은 절대 경로를 제공했습니다.

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

여기에 이미지 설명 입력

클래스의 resources디렉토리에서 읽고 싶다고 가정합니다 FileSystem.

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

참고 : 선행 .은 필요하지 않습니다.


1

나를 위해 실제로 문제는 File 객체의 클래스 경로가에서 왔 <project folder path> or ./src으므로 File file = new File("./src/xxx.txt");내 문제를 해결했습니다.


0

String basePath = new File ( "myFile.txt"). getAbsolutePath (); 이 기본 경로는 파일의 올바른 경로로 사용할 수 있습니다.


-1

전화하려는 경우 getClass()정적 메서드 또는 정적 블록에서 다음과 같은 방법으로 수행 할 수 있습니다.

로드 getClass()중인 Properties객체를 호출 할 수 있습니다 .

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

닫는 따옴표가 누락되었습니다.
jamesdeath123

-1

텍스트 파일이 읽히지 않으면 다음과 같이 더 가까운 절대 경로를 사용해보십시오 (완전한 절대 경로를 사용할 수있는 경우).

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

절대 경로가 다음과 같다고 가정합니다.

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.