2017-12-21 26 views
1

Intelli-J Idea IDE를 사용하고 Java EE 웹 프로젝트에서 작업하고 있습니다. words.txt 파일을 읽으려고합니다. 코드는 명령 행에서 제대로 작동하지만 glassfish 서버에 코드를 배포하면 "FileNotFoundException"이 표시됩니다.Java EE 웹 프로젝트에서 파일 읽기

파일은 파일 내용을 읽을 코드

"SRC/분석/pWords.txt"에 있습니다 StackOverflow의 검색 후

Scanner scan = new Scanner(new File("src/Analyser/pWords.txt")); 

을, 나는이 파일을 추가 할 필요가 있다는 것을 발견 resources 디렉토리. 불행히도 리소스를 만들 수 없습니다.

InputStream inputStream = new FileInputStream("src/Analyser/pWords.txt"); 

InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream("src/Analyser/pWords.txt"); 
InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream("pWords.txt"); 

그러나 결과는 null 또는 error이다 : 나는 src 폴더에 패키지 main과 자원을 만들 때 패키지가 나는 등의 다른 방법을 시도, main.resources된다.

내 프로젝트에서 src/Analyser/ 디렉토리의 파일을 읽을 수있는 방법이 있습니까? 그것은 Java EE 웹 프로젝트입니다.

는 UPDATE : 프로젝트 구조에서

> 유물>WEB-INF 폴더, 나는 pWords.txt 파일을 업로드했습니다. 이제 BufferedReader가 비어 있지 않고 디버깅 중에 bufferedReader에 데이터가 있음을 알 수 있습니다. 그러나 데이터를 문자열 변수에 복사하면 변수는 null로 남습니다. 나는 그것에 대해 아주 혼란 ​​스럽다.

코드 :

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    InputStream stream = classLoader.getResourceAsStream("pWords.txt"); 
    BufferedReader bf = new BufferedReader(new InputStreamReader(stream)); 
    String t = ""; 
    try { 
     while((t = bf.readLine()) != null) { // in debugging, (cb) contains the char data as char elements. 
      t += bf.readLine(); // but t = null 
     } 
    } catch(IOException x) { 

    } 
+2

당신은 자바 EE의 파일 시스템을 사용할 수 없습니다. 클래스 경로 자원에 대한 입력 스트림을 열어야합니다. 출처가 아니어야합니다./resources는 classpath에 있어야합니다.패키지 루트에 상대적인 읽기. – duffymo

+0

@duffymo 클래스 패스에 어떻게 자원을 추가 할 수 있습니까? 두 번째로, 저는 자원 디렉토리를 만들 수 없습니다. – Nix

+1

만들 수 없습니다? 물론 당신은 할 수. 표준 Maven 디렉토리 구조를 사용하고 IntelliJ 이슈를 사용하여 Java EE 패키지를 빌드하는 것이 좋습니다. src/main/resources 내용은 자동으로 CLASSPATH에 저장됩니다. – duffymo

답변

1

이 코드 내에서 두 가지 문제 /하는 오류를 시도!

1.) 두 가지 방법으로 변수 t를 사용하고 있습니다. 한편으로는 결과를 t += bf.readLine();으로 결합하는 반면에, 스트림의 추가 입력으로 (t = bf.readLine()) != null을 덮어 쓰게됩니다. while 루프의 중단 조건이므로 t는 항상 null이 될 것입니다!

2.) while 조건에서 그리고 루프 내에서 다시 bf.readLine()으로 전화를 겁니다. readLine()의 API/javadoc을 읽으면이 두 호출이 2 개의 다른 (!) 결과를 반환한다는 것을 알 수 있습니다. 이렇게하면 스트림 (bf)에 한 줄의 텍스트 만 포함되어있는 경우 조건부에서 bf.readLine()을 호출하면 텍스트 줄이 반환되고 t 변수에 추가하려고하면 bf.readLine() (두 번째) 호출이 스트림의 마지막에 이르렀으므로 null을 리턴합니다.

가능한 해결 방법 :

String singleLine; 
String wholeText = ""; 
try { 
    while((singleLine = bf.readLine()) != null) { 
     wholeText += singleLine; 
    } 
} catch(IOException x) { 
} 
1

닉스는 당신이이

InputStream in = this.getClass().getClassLoader() 
           .getResourceAsStream("Analyser/pWords.txt”); 
+0

'this'는 정적 컨텍스트에서 참조 될 수 없습니다. 이 오류가 발생합니다. – Nix

+0

전체 수업을 게시 할 수 있습니까? – Kumar

+0

정적 클래스이기 때문에 정적이 아니기 때문에'this'를 사용할 수 없습니다. 나는 방금이 방법에 문제가있어서, 질문을 업데이트 해주십시오. – Nix