2014-09-10 5 views
0

나는 조건이 충족되는 경우 특정 라인을 각 라인을 통해 대한 기존 파일, 루프 액세스 (문자열로 문자열) 대신이 방법이 있습니다자바 fileinput 함수 (읽기 및 쓰기)

FILE FTPDateTejas=2014/07/01 00:59:00 
FILE FTPDateTejas=2014/09/10 00:00:00 

을하지만 파일을 확인할 때, 날짜는 여전히 동일하게 유지하십시오 SYSOUT에서

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.InputStreamReader; 

private void UpdateConfig() { 
    try { 
     FileInputStream fstream = new FileInputStream("c:\\user\\config.properties"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      if (strLine.contains("FTPDate=2014/07/01 00:59:00")) { 
       System.out.println("FILE " + strLine); 
       strLine.replace("FTPDate=2014/07/01 00:59:00", "FTPDate=2014/09/10 00:00:00"); 
       //strLine.replace("((19|20)\\d\\d/(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])", "2014/09/10 00:00:00"); 
       System.out.println("FILE " + strLine); 
      } 
     } 
     in.close(); 
    } catch (Exception e) { 
    } 
} 

은 그것의 존재가 대체 보인다. 내가 놓친 게 있니? 아무도 내가 놓친 것을 아는 사람? 당신이 일을 할 때

+2

'replace'는 메모리의 문자열을 변경하지만 디스크는 변경하지 않습니다. 쓰기 위해 다른 파일을 열고 각 행을 써야합니다. –

답변

0

감사합니다 :

strLine = br.readLine()는 메모리에 BufferedReader에서 다음 줄을로드합니다. 즉, 디스크와 메모리에 데이터가 있고이 두 데이터가 서로 연결되어 있지 않다는 의미입니다. strLine에 수정을 할 때 나는 당신이 당신의 코드를 믿습니다 : replace으로

strLine = strLine.replace("FTPDate=2014/07/01 00:59:00", "FTPDate=2014/09/10 00:00:00");

가 호출되고있는 객체의 내용을 수정하지만 새로운 String 객체 (문자열는 불변) 반환하지 않습니다 . 그래서 그것은 새로운 객체를 생성하지만 디스크 데이터를 수정하지 않습니다 (말했듯이 더 이상이 객체에 링크되어 있지 않습니다!).

당신은 "ok라고 생각하면 어떻게 그 두 파일을 연결하고 파일을 덮어 쓰게 할 수 있습니까?"라고 생각할 수 있습니다. 잘 Java는 무작위 파일 액세스 as described in the doc을 제공하지만 특정 위치에 modify자를 사용할 수있는 유일한 방법은 중간에 물건을 삽입 할 수 없다는 것입니다. 그래서 당신이해야 할 일은 파일의 나머지 부분을 읽고, 수정 한 다음 파일의 나머지 부분을 추가하는 것입니다. 예를 들어 대체 할 새로운 문자열이 무엇보다 짧거나 길 때를 대비해야합니다. 대체하고 있습니다.

쉬운 솔루션을하는 것입니다 왜 그 (바꾸기 후 문자열 를)

  1. 이전을 삭제 그것에 라인으로
  2. 기록 라인에 쓸 새 파일을 엽니 다 새 파일의 이름을 바꾸고 파일 이름 바꾸기

파일을 복사하지 않고 코드는 다음과 같이 보입니다.

private void UpdateConfig() { 
    File fstream = new File("c:\\user\\config.properties"); 
    File file = new File("c:\\user\\config.properties-new"); 
    try { 
     file.createNewFile(); 
    } catch (IOException e) { 
     // handle 
    } 
    try (FileReader in = new FileReader(fstream); 
     FileWriter fw = new FileWriter(file.getAbsoluteFile())) { 

     try (BufferedReader br = new BufferedReader(in); 
      BufferedWriter bw = new BufferedWriter(fw)) { 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
       if (strLine.contains("FTPDate=2014/07/01 00:59:00")) { 
        System.out.println("FILE " + strLine); 
        strLine = strLine.replace("FTPDate=2014/07/01 00:59:00", 
          "FTPDate=2014/09/10 00:00:00"); 
        //strLine.replace("((19|20)\\d\\d/(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])", "2014/09/10 00:00:00"); 
        bw.write(strLine); 
        System.out.println("FILE " + strLine); 
       } 
      } 
     } 
     // copy files here 
    } catch (IOException e) { 
     // handle 
    } 
} 

일반 텍스트 편집기에서 쓰는 동안 논리적/구문 적 문제가있을 수 있습니다. Java 7의 try-with-resources를 사용하기 위해 코드를 약간 수정했습니다. 이는 코드에서 예외가 발생할 때 스트림이 닫히지 않았을 때 코드에서 코드를 닫는 것보다 더 깨끗한 방법입니다.

+0

제대로 작동하는 샘플 코드로 자세한 설명을 보내 주셔서 감사합니다. 정말 감사합니다. :) –