2009-06-26 4 views
3

파일을 열고 다른 함수로 전달하여 일부 데이터를 쓰는 한 가지 방법이 있습니다. 두 번째 방법은 PrintWriter를 사용하여 데이터를 쓰려고합니다. 그러나 모든 사람들이 PrintWriter를 사용하여 해당 스트림에 쓰도록 요구하고 싶지 않았습니다. 나는 'pr.flush을 넣어하지 않는Java의 OutputStream에서 작성기 교환

현재는,이 작동하지 않습니다

public void exportRawDataIntoStream(OutputStream os) { 
    PrintWriter pr = new PrintWriter(os); 
    printFirstData(pr); 
    printSecondData(pr); 
} 

public void exportToFile(File file) { 
    OutputStream os = null; 
    try { 
     os = new BufferedOutputStream(new FileOutputStream(file)); 
     exportRawDataIntoStream(os); 
       doMoreWithTimeFile(os); 
    } finally { 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

(메소드 나 변수 이름의 나의 선택을 비판 귀찮게하지 않습니다 소독 예 ...)이 같이 보입니다 '를 exportRawDataIntoStream 끝에 추가하십시오. 전체 스트림을 닫으므로 PrintWriter를 닫을 수 없습니다.

홍조가 합법적이고 안정적입니까? Writer를 같은 스트림에 믹싱하는 데 사용해야하는 다른 접근 방식이 있습니까? 아니면 절대 수행하지 않아야합니까?

답변

4

예. 플러시가 안정적이어야합니다. 기본적인 역할은 초과 데이터를 "밀어 붙이는 것"입니다.

그러나 공평하게 말하면 기본 라이터에서만 작동합니다. 마음, 나는 그것이 전부는 아니더라도 대부분이라고 생각합니다.

그러나 어떤 고안된 특별한 종류의 작가를 생각해보십시오. 가까운 곳에서 "뭔가 다른 것"을하는 것. 암호화 또는 압축 스트림과 같습니다.

말하자면 "base64 인코더 작성기"가 있다고 가정합니다. 잠재적으로 후행하는 "=="을 DONE이 될 때까지 안전하게 쓸 수 없으며 이는 닫기가 아닌 플러시입니다.

그러나주의 할 점은 PrintWriter를 사용할 때 문제가되지 않아야한다는 것입니다.

+0

다른 스트림을 랩하는 Writers 및 OutputStream의 구현은 close()가 실제로 기본 스트림을 닫을 지에 따라 달라집니다. 경우에 따라 기본 스트림이 닫히지 않는다는 것을 알고 있으면 close()를 호출 할 수 있습니다. – JimN

+0

압축 스트림과 같은 것은 일반적으로 기본 스트림을 닫지 않고 출력을 처리하는 finish() 메서드 또는 유사한 기능을 제공합니다. –

+0

네, 그게 항상 혼란스러운 부분이었습니다. "닫기"는 체인 전체를 닫으려는 것이지만, 일부는 그렇다고 생각합니다. 일부는 그렇지 않습니다. –