2012-05-15 2 views
0

님의 질문에 답변했습니다. 도움을 주시고 귀하의 도움을 주시기 바랍니다.import java.util.zip.ZipOutputStream; 파일로 인쇄 할 때 문제가 발생했습니다.

Writer output = null; 
    File pdfFile = new File("MANIFEST.txt");//create text file 
    try { 
     output = new BufferedWriter(new FileWriter(pdfFile)); 
    } catch (IOException e) { 
     //TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    for(int i=0; i<files.length; i++){//create manifesto of pdfs in directory 
     try { 

      System.out.println(copy[i]); 
      output.write(copy[i]); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }   

copy는 문자열 배열입니다. 내용은 콘솔에 제대로 인쇄되지만 파일에는 인쇄되지 않습니다 (파일은 생성됩니다). import java.util.zip.ZipOutputStream을 포함 시키면 try catch에 넣지 않는 한 많은 것들이 예외를 throw합니다 (output.write는 "처리되지 않은 예외 유형 IOEception"을줍니다).

+1

try/catch를 사용하여 _syntax_ errors를 해결하지 않습니다. 예외가 있다는 뜻입니까? 그렇다면 여기에 게시하십시오. – michael667

+0

무엇이 문제인지 잘 모르겠습니다. 그러나 인쇄중인 내용이 파일에 표시되지 않는다고 가정합니다. for 루프 외부의 파일에 강제로 쓰기 위해 버퍼링 된 작성기를 플러시해야한다고 생각합니다. – Drona

+0

미안하지만, 나는 그것을 알고 있지만 잘못된 단어를 사용했습니다. 시도 캐치가 없으면 output.write는 "처리되지 않은 예외 유형 IOException"예외를 제공합니다. – babno

답변

0

for 루프의 조건으로 i < files.length을 사용하지만 copy[i]에 액세스하십시오.

for(final String element : copy) { 
    System.out.println(element); 
    output.write(element); 
} 
+0

이제 스레드 "main"의 런타임 예외 Exception을 얻습니다. \t at java.io.Writer.write (알 수없는 소스) \t at navigate.main (navigate.java:55) (55가 출력됩니다. 쓰기) – babno

+0

첫 번째 시도/catch 블록에서 그 전에 또 다른 예외가 발생합니까? 모든 try/catch 블록을 제거하고 메소드 시그니처에'예외를 throw '하십시오. – michael667

+0

나는 그것이 파일이되는 이유가 기억났다. 길이 (복사본이 그 안에있는 값의 수보다 컸다). 나는 그 문제를 고쳤고 심지어 여전히 copy.length는 이전의 방식으로 되돌아 갔다. output.write를 주석 처리하면 내가 볼 수있는 차이가 없습니다. – babno

2

만약 당신이 작가를 닫 마십시오

for(int i = 0; i < copy.length; i++) { 
    System.out.println(copy[i]); 
    output.write(copy[i]); 
} 

또는 더 나은, foreach는 루프를 사용 :이 같은 것을 사용하는 것이 좋습니다? 당신이, 당신이 그것을 보장하기 위해 finally block를 사용해야합니다 (예 : 리더/라이터/데이터베이스 연결/등과 같은) I/O 리소스를 만들 때마다 닫혀 일반적으로

,이 같은 :

Writer writer = new BufferedWriter(...); 
try { 
    // do something with the writer; may be many lines of code 
} 
finally { 
    writer.close(); 
} 

(참고 : Java 7은이 패턴에 대해보다 간결한 구문을 사용합니다 (예 : the try-with-resources block).

이는 자원 관리에 중요합니다 (예 : 연결/파일을 닫지 않으면 결국 프로세스의 파일 핸들이 부족해집니다. 더 이상 열 수 없습니다).

그러나 관련 문제도 있습니다. 많은 운영자가 기본 운영 체제에 한 번에 한 문자 씩 작성하는 성능 저하를 피하기 위해 버퍼링됩니다. write을 호출하면 해당 데이터가 버퍼에 저장되고 주기적으로 파일에 기록됩니다 (충분히 큰 경우). 을 플러시이라고합니다.

데이터를 플러시하기 전에 작성기를 단순히 삭제하면 파일이 업데이트되지 않습니다.

flush()은 수동으로 호출 할 수 있지만 거의 필요하지 않습니다. 작성자의 close()을 호출하면 모든 리소스가 해제 될뿐만 아니라 버퍼도 플러시됩니다. 위의 try/finally 패턴을 사용하면 이 보장되어 프로세스가 종료 될 때 try 블록 내에서 작성한 내용이 파일에 기록됩니다. 현재 코드로는 보증이 없으며 작성자의 구현에 따라 다릅니다.

관련 문제