0

텍스트 파일을 읽고 "모두"를 "\"로 바꾸고 결과를 새 텍스트 파일에 써야합니다. 내 텍스트 파일이 큽니다 (16MB).이 작업을 완료하는 데 몇 시간이 걸립니다. 더 빨리 구현할 수있는 다른 방법이 있습니까? 대신 문자로 문자를 읽는런타임 최적화

public static void main(String [] args) throws IOException { 
     String fileName = "file1.txt"; // The name of the file to open. 
     String s="";    // This will reference one line at a time 

     BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); 
     int c, n=0; 
     char character; 

     while((c = reader.read()) != -1) { 
      character = (char) c; 
      if (character == ',') 
       s = s + "\n"; 
      else 
       s += character; 
     } 
     reader.close(); 

     PrintWriter out = new PrintWriter("fileName1.txt"); 

     out.println(s); 
     out.close(); 
} 

답변

3

FileWriter을 포장해야합니다 : 당신은 실제로 각 문자를 당신이 그것을 처리 완료 각 행을 작성하거나 할 수 있습니까?

 if (character == ',') 
      s = s + "\n"; 
     else 
      s += character; 

는 기본적으로, 당신은 당신의 입력 파일의 모든 단일 문자에 대한 문자열 연결을하고있다 :

주요 병목 현상이 문입니다. 파일에 N 개의 문자가있는 경우 N 개의 문자열을 생성하고 연결은 대략 N * (N + 1)/2 문자를 복사합니다. N이 16,000,000 인 경우 거대한 문자 수가 복사됩니다. (그리고 가비지 컬렉션의 많은 너무.)

당신은 단순히 연결을 방지하기 원한다면,이 솔루션은 StringBuilder s으로 String s 교체 ... 그리고 출력 문자열을 구축하기 위해 append 작업을 사용하는 것입니다.

그러나이 경우 가장 좋은 해결책은 출력 파일에 BufferedWriter을 열고 메모리에 문자열을 작성하지 않고 직접 문자를 쓰는 것입니다.


후속

당신은 무엇을 의미합니까? 내가 구문 "자원과 노력"자바 7을 사용하고

public static void main(String[] args) throws IOException { 
    try (BufferedReader reader = new BufferedReader(new FileReader("in.txt")); 
     BufferedWriter writer = new BufferedWriter(new FileWriter("out.txt"))) { 
     int c; 
     char character; 
     while ((c = reader.read()) != -1) { 
      character = (char) c; 
      if (character == ',') 
       writer.write('\n'); 
      else 
       writer.write(character); 
     } 
    } 
} 

참고 :

나는 같은 것을 의미한다. 리소스 (즉, 스트림)는 try-catch-finally 문이 완료되면 자동으로 닫힙니다.

+0

무엇을 의미합니까? String을 사용하지 않는 방법이 있다면 더 좋을 것입니다. 어떻게 출력 파일을 읽고, ","/ "n"로 변경하고 그 문자를 직접 쓸 수 있습니까? – Ryainad

+0

고마워요! 지금 일하고있어! 빛의 속도로! – Ryainad

3
  1. 는 라인으로 라인을 읽어 보시기 바랍니다.
  2. 읽을 때마다 replaceAll() 메서드를 호출하여 모든 쉼표를 "\ n"으로 바꿉니다. 당신은 어떤 종류의 유닉스를 사용하는 경우 사용 BufferedWriter의
+0

처음 두 아이디어는 도움이되지 않을 것입니다. 캐릭터 프로세싱에 의한 캐릭터는 가장 빠른 가능성이 있습니다 ... 당신이 전체를 메모리에 저장하려고하지 않는다면. –

+0

자바가 파일과 바이트의 큰 덩어리를 로딩하는 것 사이의 속도 차이를 추상화했다면 나는 감명을 받았다. –

+0

@MattBryant -'BufferedReader'와'BufferedWriter'가 그것을 처리해야합니다. 더 빠른 방법 (NIO/CharBuffer 등 사용)이있을 수 있지만 문자 처리에 의한 문자는 "충분히 근접한"것입니다. 그것은 실행 시간을 (몇 초) 줄여야합니다. –

2

  • , 당신은이에 대한 명령 줄을 사용할 수 있습니다.

    sed 's/,/\n/g' input.txt > output.txt 
    
  • +0

    제안 해 주셔서 감사합니다. 지금은 훨씬 좋습니다! – Ryainad

    +0

    Mac을 사용하는데 작동하지 않습니다. – Ryainad

    +0

    * * 무엇이 작동하지 않습니까? –

    1

    시간은 문자열을 연결하는 데 소비됩니다. 그렇게 할 필요가 없습니다. 후자의 경우, 당신은 더 빨리 구현하는 다른 방법이있는 BufferedWriter.