2011-10-25 5 views
1

이 코드는 로컬에서 잘 실행되지만 bamboo를 사용하여 빌드 할 때 파일을 찾을 수 없습니다. 예외가 발생합니다. 어떤 아이디어/해결 방법?현재 패키지에서 파일 가져 오기

final static String FILE_NAME ="/src/test/java/com/statement/SamplePDFStatementFile.txt"; 
file = new File(FILE_NAME); 
FileInputStream fis = new FileInputStream(file); 

기본적으로 파일을 읽는 클래스를 테스트하고 싶습니다. 완전한 코드가 있습니다.

//Main Class 
public class PdfRenderer { 

    public void render(PdfFile pdfFile) throws IOException { 
     FileInputStream fis = new FileInputStream(pdfFile.getFile()); 

     final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); 
     response.setHeader("Content-Disposition", " attachment; filename=" + pdfFile.getAttachmentName()); 

     byte[] buff = new byte[2048]; 
     int bytesRead; 
     while (-1 != (bytesRead = fis.read(buff, 0, buff.length))) { 
      response.getOutputStream().write(buff, 0, bytesRead); 
     } 

     response.getOutputStream().flush(); 

    } 
} 

//Test 

public class PdfRendererTest{ 

    PdfFile pdfFile; 
    File file; 

    @Test 
    public void test_DetailStatementsByAccountNumber() throws Exception { 
     new AbstractSeamTest.ComponentTest() { 

      PdfRenderer actionBean = new PdfRenderer(); 

      URL url = this.getClass().getResource("/SamplePDFStatementFile.txt"); 
      final String FILE_NAME = url.getFile(); 

      protected void testComponents() throws Exception { 

       file = new File(FILE_NAME); 

       context.checking(new Expectations() {{ 
        one(pdfFile).getFile(); 
        will(returnValue(file)); 
        one(pdfFile).getAttachmentName(); 
        will(returnValue(file.getName())); 
       }}); 

       actionBean.render(pdfFile); 
      } 

     }.run(); 
    } 
} 

pdfFile.getFile()이 SamplePDFStatementFile.txt를 반환 할 것으로 예상하고 싶습니다. getResourceAsStream을 사용하는 경우 파일 객체로 변환하는 방법을 모르겠습니다.

OK .. 이제 사용하고 있습니다. 보이는 그 대답 :)

public void inputStreamToFile() throws Exception{ 
       InputStream inputStream = this.getClass().getResourceAsStream("/SamplePDFStatementFile.txt"); 

       file = File.createTempFile("abc","def"); 
       OutputStream out = new FileOutputStream(file); 

       int length = 0; 
       byte[] bytes = new byte[1024]; 

       while ((length = inputStream.read(bytes)) != -1) { 
         out.write(bytes, 0, length); 
       } 

       inputStream.close(); 
       out.flush(); 
       out.close(); 
      } 
+0

당신 * 구축 * 그것 또는이 파일을로드 할 수 있습니다 그 후

너 * 달리는거야? –

+0

루트 패키지 ('com')에서 시작하는 경로를 사용하여 클래스 로더 (컨텍스트 클래스 로더 또는 현재 클래스를로드 한 클래스 로더)에서'getResource' 메소드를 사용하는 방법을 참조하십시오. 당신은 절대 경로를 사용하고 있습니다. –

+2

또한 파일이 SRC 폴더 아래에있는 것처럼 보입니다. 일반적으로 SRC 폴더가 제외되어 빌드됩니다. 확인할 수 있습니까? – r0ast3d

답변

5

신뢰할 수있는 방법으로 프로젝트 루트 폴더를 기준으로 파일을 참조 할 수 없습니다.

대신이 파일을 리소스로 참조해야합니다. 내가보기 엔 Maven을 사용합니다. 그렇다면이 파일을 /src/test/java 대신 /src/test/resources에 넣어야합니다 (/src/test/java에서 리소스를 가져 오기 위해 Maven을 구성 할 수도 있지만 Maven 디렉터리 레이아웃 규칙을 위반하는 것일 수 있습니다). 당신이

InputStream fis = getClass() 
    .getResourceAsStream("/com/statement/SamplePDFStatementFile.txt"); 

또는 현재 클래스의 com.statement 패키지에있는 경우는 예외를 제공

InputStream fis = getClass().getResourceAsStream("SamplePDFStatementFile.txt"); 
+1

당신의 제안에 따라 나는'src/test/resources/SamplePDFStatementFile.txt'와'src/test/java/com/billmelater/csa/action/statement/PdfRendererTest '에있는 나의 메인 클래스에 텍스트 파일을 넣었다. java 클래스 메쏘드는 당신의 리소스의 폴더와 일치하지 않기 때문에, 당신은 다음을 할 필요가 있습니다 : getResourceAsStream ("SamplePDFStatementFile.txt");하지만 null을 리턴합니다. –

+0

@Himalay : 다음과 같이 전체 경로를 사용하십시오 :'getResourceAsStream ("/ SamplePDFStatementFile.txt")'. – axtavt

+0

감사합니다 axtavt .. 당신은 내 하루를 만들었습니다. 단지 하나의 마지막 clearifaction은 아래 코드가 괜찮은 것처럼 보이는 경우입니다 (실행 현명한). 다시 빌드를 깰 싶지 않아요. 'URL url = this.getClass(). getResource ("/ SamplePDFStatementFile.txt"); ' '최종 문자열 파일 이름 = url.getFile();' 'file = 새 파일 (FILE_NAME); ' 'FileInputStream fis = new FileInputStream (pdfFile.getFile()); –