2013-12-18 1 views
0

다음 코드 스 니펫을 사용하여 파일을 한 줄씩 읽고 다른 파일에 쓰려고합니다. 내 입력 파일은 대략 13000 라인이 포함되어 있지만,이 코드를 추가 한 후 바로 12000 라인에만FileReader 및 BufferedReader를 사용하는 동안 .close()를 잊어 버렸습니다.

public class FileReadWrite { 

public static void main(String args[]) { 

    FileReader input = null; 
    BufferedReader br = null; 
    BufferedWriter printer = null; 
try { 
    input = new FileReader("input.txt"); 
    File output = new File("output.txt"); 
    br = new BufferedReader(input); 
    printer = new BufferedWriter(new FileWriter(output)); 
    String s; 
    while((s = br.readLine()) != null){ 
      printer.write(s); 
      printer.newLine(); 
    } 
} 
catch(FileNotFoundException e) { 
    System.err.println("File not found. Please scan in new file."); 
} 
catch(Exception e) 
{ 
    System.err.println("Exception occured"+e); 
} 
} 

로 출력 파일을 생성은 그 괜찮

finally{ 

      try 
      { 
        input.close(); 
        br.close(); 
        printer.close(); 
      } 
      catch(Exception e) 
      { 
      } 
    } 

어떤 이유를 작동 니펫을?

+0

Java 인 경우 해당 태그를 편집하여 추가하십시오. "BufferedReader"는 빈 줄을 무시합니까? –

+0

아니요 빈 줄을 무시하지 마십시오 – Mady

+1

최종 최종본에 동일한 끝선 문자가 포함되어 있으며 인코딩이 동일합니까? 당신은 notepad ++로 확인할 수 있습니다. 예를 들면 – Kiwy

답변

0

닫기 버퍼링 된 스트림 (사실상 모든 스트림)이 중요합니다.

스트림을 닫으면 버퍼링 된 내용이 디스크로 플러시되어 모든 13k 레코드가 파일에 기록됩니다.

1

나는 장점을 가지고 바이너리 전송을 수행하는 것이 좋습니다

  • 당신이/디코딩 당신이 당신의 텍스트 엉망으로 인코딩에 대해 걱정할 필요가 없습니다 귀하의 텍스트를 인코딩하지 않는
  • 당신에게 돈 \r 또는 \n 또는 \r\n
  • 일 수있는 새로운 줄 구분 기호와 일치하는 것에 대해 걱정할 필요가 없습니다. 버퍼간에 복사 할 필요가 없습니다. 모든 복사는 원시 코드/메모리에서 수행됩니다.
  • 코드/단축 및 시도 -과 - 자원 블록이 당신을 위해 자원을 닫습니다

훨씬 더 빨리 우리가 자바 파일 입/출력 작업을 할 때마다

try (FileChannel from = new FileInputStream(fromFile).getChannel(); 
    FileChannel to = new FileOutputStream(toFile).getChannel()) { 
    from.transferTo(0, from.size(), to); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); 
} 
+0

제안 해 주셔서 감사합니다. 줄 단위로 문자열을 처리해야하는 이유는이 방법을 선택하는 이유입니다. – Mady

0

. 이 강령은 읽고 쓰는 데 필요한 중요한 시스템 자원을 사용합니다. 이 때문에 우리는 모든 스트림을 닫아야하고 모든 파일에 데이터를 쓰고 나서 플러시 및 닫기 메소드를 사용해야합니다. 그렇지 않으면 모든 데이터가 기록되지 않을 수 있습니다.