2014-03-03 6 views
0

그래서 텍스트 파일의 특정 지점에 문자열을 쓰고 싶습니다. 꽤 쉬워야하지만 BufferedWriter 클래스를 처음 사용합니다. 내 소스는 다음과 같습니다 :특정 지점의 텍스트 파일에 무언가 쓰기 Java

public static String readFile(String fileName) throws IOException { 
    String toReturn = ""; 
    BufferedReader br = null; 

    try { 
     String sCurrentLine; 
     br = new BufferedReader(new FileReader("test.txt")); 
     while ((sCurrentLine = br.readLine()) != null) { 
      toReturn = toReturn+"\n"+sCurrentLine; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (br != null)br.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    return toReturn; 
} 

public static void addAfter(String toAdd, char after, String fileName) throws IOException { 
    String file = readFile(fileName); 
    int length = file.length(); 
    char[] chr = file.toCharArray(); 
    boolean pos[] = new boolean[length]; 
    for(int i = 0; i < length; i++) { 
     if(chr[i] == after) { 
      pos[i] = true; 
     } 
    } 

    BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); 
} 

BufferedWriter 클래스를 사용하여 위치 i에 String toAdd를 추가하고 싶습니다. 원하는 포인트로 점프하고 추가로 작성하는 방법은 무엇입니까? 사전에

감사

+0

'RandomAccessFile'에는 파일의 특정 바이트로 점프하는 메소드가 있습니다. 나는 그 방법이'skipBytes()'또는 그와 비슷한 것이라고 생각한다. 그러나 텍스트를 삽입하려고하면 기본적으로 파일 IO가 덮어 쓰기로 처리되므로 다소 까다로울 수 있습니다. 당신이해야 할 일은 그 시점의 원래 파일을 읽고 추가하는 것입니다. – CodeChimp

+0

이 작업을 수행하려면 파일의 내용을 String으로 읽고, 편집으로 새 String을 만든 다음 새 String으로 파일을 덮어 써야한다고 생각합니다. http://stackoverflow.com/questions/3935791/find-and-replace-words-lines-in-a-file을 참조하십시오. – ktm5124

+0

@ ktm5124 링크를 이용해 주셔서 감사합니다. –

답변

0

한 가지 방법은, 메모리에 전체 텍스트 파일을 읽고 수정/당신에 삽입 할 선 (들)을 교체 한 다음 텍스트 파일에서 다시 문자열을 쓰기 덮어 쓰기하는 것 소스 파일

다소 안전한 방법은 두 번째 파일에 쓰고 출력을 저장하면 원본 파일을 삭제하고 출력 파일의 이름을 원본 파일의 이름으로 변경하는 것입니다. 어떤 이유로 쓰기 프로세스에서 예외를 throw하면 데이터가 손상되지 않습니다.

0

CodeChimp는 귀하의 질문에 대한 언급에서 언급했듯이 삽입 후의 모든 텍스트는 파일에 다시 써야합니다. 따라서 새 임시 파일을 열고 원본을 읽고 삽입 지점까지 새 파일로 텍스트를 복사하고 새 파일에 새 텍스트를 쓰고 이전 파일의 나머지를 복사하고 두 파일을 닫은 다음 , 원래 파일을 삭제하고 새 파일의 이름을 바꿉니다. 또는 원본 파일의 이름을 임시 파일 이름으로 바꾸고 수정하려는 파일의 원래 이름으로 빈 파일을 새로 만들고 위와 같은 복사 및 삽입 절차를 수행 한 다음 이름이 변경된 원본 파일을 삭제합니다. 두 가지 옵션 중에서 선택할 수있는 것은 오류 처리와 동시 액세스를 제어하는 ​​데 잠금을 사용할지 여부에 따라 다릅니다.

+0

매우 비효율적이지만 감사합니다. –

+0

인덱싱 된 파일 형식을 사용하면 삽입이 훨씬 효율적일 수 있지만 텍스트 파일은 인덱싱 된 파일 형식이 아닙니다. 몇몇 다른 사람들이 제안했듯이 임시 파일을 건너 뛰고 원본 파일을 메모리로 읽어 와서 필요한 시점에 새 텍스트를 삽입 한 다음 원래 파일 내용을 버퍼의 끝에 추가하는 작업을 완료하는 것이 좋습니다 원본 파일을 모두 다시 쓰십시오. 그러나 이는 업데이트되는 파일의 크기에 따라 크게 달라 지므로 필자가 제안한 비교적 간단한 방법보다 효율적이지 않을 수 있습니다. – Ned

+0

@Ned_Nowotny 검색 및 바꾸기 옵션을 사용했다. 필요한 파일의 생성/삭제가 필요하지 않습니다. –