2013-08-14 1 views
0

Java를 처음 접하십니다. Java HTTP 서버를 구축 중입니다 (특별한 라이브러리는 허용되지 않습니다). 거기에 내가 섬기는 데 필요한 특정 파일 (템플릿 내가 그들을 부르는 것입니다) 그리고 나는이 코드 조각을 사용하여 그들을 제공했다 :getResource를 사용하여 Java의 ArrayList에 파일을 저장할 수 있습니까?

this.getClass().getResourceAsStream("/http/templates/404.html") 

그리고 내 .JAR에서 그들을 포함. 이것은 효과가 있었다. (입력 스트림으로 읽었 음을 알고 있습니다.)

이제 템플릿, 일반 파일, 내 파일 (파일 유형)을 모두 다음과 같은 해시 맵에 리디렉션합니다. url -> file . 파일을 제공하는 Response 클래스가 있습니다.

내 템플릿을 제외한 모든 항목에서 작동합니다. 해시 맵에 getResource 코드를 삽입하려고하면 Response 클래스에 오류가 발생합니다.

new File(this.getClass().getResource("/http/templates/404.html").getFile()) 

이 내가지고있어 오류는 다음과 같습니다 :

내가 내 해시 맵을 구축하기 위해 사용하고 내 코드 내가이 명령을 실행하고있는 템플릿을 볼 수 있습니다
Exception in thread "main" java.io.FileNotFoundException: file:/Users/Kelly/Desktop/Java_HTTP_Server/build/jar/server.jar!/http/templates/404.html (No such file or directory) 

내 항아리 :

jar tf server.jar 

내 생각이 잘못 됐습니까? 나는 퍼즐 조각을 놓치고 있다고 생각한다.

업데이트 : 위의 마지막 명령을 실행할 때 얻을 수있는 부분이 있습니다. 파일에 대한 경로가 올바르게 있다고 생각합니까?

http/server/serverSocket/SystemServerSocket.class 
http/server/serverSocket/WebServerSocket.class 
http/server/ServerTest.class 
http/templates/ 
http/templates/404.html 
http/templates/file_directory.html 
http/templates/form.html 
+1

getFile() 대신 getPath()를 사용해보십시오. 또한 유효한 경로인지 확인하십시오. –

+0

고마워, 조쉬! 그래도 작동하지 않았다. 나는 똑같은 정확한 오류를 얻는다. 또한 내 질문을 업데이트하여 내 server.jar에 무엇이 있는지 보여줍니다. – Kelly

+1

예외로부터의 메시지 텍스트는 당신에게 단서를 주어야합니다 : 그것은'Stream'으로 열릴 수있는 jar 파일에 대한 약간의 참조이지만 적절한'File' 위치가 아닙니다. 왜 여기에'File' 객체가 필요합니까? –

답변

1

당신이 점점되는 FileNotFoundException 오류가이 라인에서되지 않습니다 : (또는 제공

new File(this.getClass().getResource("/http/templates/404.html").getFile()) 

당신이 해시 맵에서 이러한 File 오브젝트를 저장 한 후, 파일을 읽으려는 것으로 보인다 FileInputStream 또는 관련 API를 사용하여 읽음으로써 파일). 스택 트레이스와 실제로이 예외를 던지는 코드를 제공했다면 더 유용했을 것입니다.

하지만 요점은 JAR 파일에있는 파일이 디스크에있는 파일과 같지 않다는 점입니다. 특히, File 객체는 디스크의 추상 경로 이름을 나타내고 File 객체를 사용하는 모든 표준 라이브러리는 액세스 가능하다고 가정합니다. 따라서 /a/path/like/this은 유효한 추상 경로 이름이지만 file:/Users/Kelly/Desktop/Java_HTTP_Server/build/jar/server.jar!/http/templates/404.html은 아닙니다. 이것은 정확하게 getResource("/http/templates/404.html").getFile()에 전화 할 때 얻는 것입니다. 그냥 디스크에 파일로 존재하지 않는 것을 나타내는 문자열을 반환합니다.

  • 가 직접 요청에 대한 응답으로 스트림을 반환 :

    는 직접 클래스 경로에서 자원 봉사 할 수있는 두 가지 방법이 있습니다. this.getClass().getResourceAsStream()InputStream 개체를 반환하며, 호출자에게 반환 할 수 있습니다. 이 경우 파일 대신 InputStream 개체를 해시 맵에 저장해야합니다. 클래스 경로의 파일과 디스크의 파일에 대해 각각 하나씩 두 개의 해시 맵을 가질 수 있습니다.

  • 첫 번째 액세스시 모든 템플릿을 임시 위치 (예 : /tmp)로 추출한 다음 새로 추출 된 파일을 나타내는 File 개체를 저장합니다.
+0

지연되어서 죄송합니다. 너는 이것에 대해 완전히 옳았다. 이 문제를 해결하기 위해 리소스 (inputstream 사용)를 잡고 임시 파일을 만들었습니다. 도와 주셔서 감사합니다! – Kelly