2016-11-15 4 views
1

기존 텍스트 파일의 다른 단어로 단어를 대체하고 싶습니다. 내 코드는 정확하다고 생각하지만 언제든지 프로그램을 실행하면 모든 텍스트가 텍스트 파일에서 삭제됩니다.java의 기존 텍스트 파일에서 단어를 바꾸는 방법

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
public class Test { 
    public static void main(String ar[]) throws IOException{ 

     String getText, putText; 
     File f = new File("Test.txt"); 
     FileReader fr ; 
     BufferedReader br ; 
     BufferedWriter bw; 
     if(f.exists()){ 
      try{ 
       fr = new FileReader(f); 
       br = new BufferedReader(fr); 
       bw = new BufferedWriter(new FileWriter(f)); 
       while((getText = br.readLine()) != null){ 
        System.out.println(getText); 
        if(getText != null){ 
         putText = getText.replaceFirst("Dog", "Cat"); 
         bw.write(putText); 
        } 
       } 
       bw.close(); 
       br.close(); 
      } 
      catch(IOException e){ 
       e.printStackTrace(); 
      } 
     }else{ 
      System.out.println("No File exists!"); 
     } 
    } 
} 
+0

를 작성) {'while 루프에 따라 항상 true가됩니다. –

+0

puText는 개가 대체 된 getText와 동일하므로 여전히 작동해야합니다. 정확하게 bw가 쓰는 질문입니다. 첫 번째 빈 줄에 쓰고 있습니까? – XtremeBaumer

답변

5

당신은 단순히 읽고 동일한 시점에서/에 동일한 파일에서 쓰기는 안된다.

대신 파일에서 읽기 : ; 어떤 파일에 쓰십시오. A.tmp.

그리고 당신은 절대적으로, 그래도을 삭제하고 끝에서A.tmp의 이름을 바꿀 수 있습니다하려는 경우.

마지막으로, 기록만을위한 것입니다. 목표가 실제로 그렇게된다면; 일부 텍스트 파일의 일부 문자열을 바꾸려면보다 합리적인 대답은 sed 같은 도구 (또는 Windows OS 용 일부 대안)를 조사하는 것입니다. 마지막으로 최종

boolean replacingRequired = true; 
while (... reading ...) 
    if (replacingRequired) { 
    putText = getText.replaceFirst("Dog", "Cat") 
    if (! putText.equals(getText)) { 
     // when they are different, you replaced something! 
     replacingRequired = false; 
    } 
    ... 

: 당신이 지금에 대해 요구하는대로

일부 문자열 만 occurance를 교체하려면, 당신은 당신처럼, 이미 교체 여부를 알려줍니다 일부 마커를 추가해야 을 마지막으로 어카운트로 바꾼다 ... 글쎄, 그건 완전히 달라서 하드가 문제 다. 알다시피 현재 접근법은 해당 입력 파일을 한 줄씩 읽고 해당 줄을 업데이트 한 다음 새 파일에 쓰는 것입니다. 그러나 : 어떻게 코드가 라인 단위로 진행되는지 알 수 있습니다. 라인 ... 대체하려는 패턴을 가지고있는 마지막 것입니까?! 짧은 대답 : 할 수 없습니다.

간단한 해결책은 여기에 있습니다. 파일이 정말 큰 않는 한 잘 작동하는 :

  1. 읽기 모든 라인 (예를 들어이 method 사용) 문자열의 목록
  2. 그런 다음 목록을 뒤로 도보로; 그리고 첫 번째 항목 교체 (뒤로 걸어 때 마지막 하나입니다!) 그 목록에서
  3. 이 파일에 업데이트 목록을 작성
+0

동일한 파일 이름을 원합니다.임시 파일을 만들고 기존 파일을 삭제하고 임시 파일의 이름을 기존 파일로 바꿀 수 있습니까? – topper1309

+0

확실한 것; 그에 따라 내 대답을 업데이 트되었습니다. – GhostCat

+0

그것은 일했다! 루프가 작동 할 때마다 4 줄이 있기 때문에 모든 "Dog"가 "Cat"으로 바뀌는 대신 "Dog"의 첫 번째 항목 만 바꾸고 싶다는 질문을 한 가지 더하고 싶습니다. 그래서 "Dog"만 첫 번째로 변경할 수 있습니까? – topper1309

0

당신은 시도하고 읽는 대신 파일을 복제해야하며, ,

0

이 시도 동일한 파일에 같은 파일 당신이 그것을 읽을 때 ... 그래서 그래, 어쨌든`경우 (gettext에! = null을 덮어 쓰지

 .... 
    StringBuilder fullText =new StringBuilder(); 
     while((getText = br.readLine()) != null){ 
      putText = ""; 
      if(getText != null){ 
       putText = getText.replaceFirst("Dog", "Cat"); 
      } 
      fullText.append(putText); 
     } 
    br.close(); 
    bw.write(putText); 
    bw.close()