2017-12-15 1 views
0

스캐너 클래스가있는 텍스트 파일에서 특정 텍스트 (예 : 단어)를 검색 할 수있는 코드를 작성했지만 이전 텍스트도 새 텍스트)를 동일한 이전 텍스트 위치에 표시합니다. 인터넷에서 replaceAll 메서드 (replaceAll (old, new);) 을 사용해야하지만 스캐너 클래스에서는 작동하지 않습니다.스캐너 클래스가있는 텍스트 파일의 특정 텍스트 변경

이것은 내 코드입니다. 이전 코드를 변경하지 않고 새 줄에 새 텍스트를 작성하면됩니다.

양식 스캐너를 FileReader로 변경해야합니까 ??

File file = new File("C:\\Users....file.txt"); 
Scanner input = new Scanner(System.in); 
System.out.println("Enter the content you want to change:"); 
String Uinput = input.nextLine(); 
System.out.println("You want to change it to:"); 
String Uinput2 = input.nextLine(); 

Scanner scanner = new Scanner(file).useDelimiter(","); 
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true)); 
while (scanner.hasNextLine()) { 
    String lineFromFile = scanner.next(); 
    if (lineFromFile.contains(Uinput)) { 
     lineFromFile = Uinput2; 
     writer.write(lineFromFile); 
     writer.close(); 
     System.out.println("changed " + Uinput + " tO " + Uinput2); 
     break; 
    } 
    else if (!lineFromFile.contains(Uinput)){ 
     System.out.println("Don't found " + Uinput); 
     break; 
    } 
} 
+0

1. 파일의 모든 내용 (파일에서 읽기)을 가져 와서 데이터 구조에 저장하십시오. 2 내용을 변경하십시오. 3 변경된 내용을 파일에 저장합니다 (파일에 쓰기). – Sedrick

+0

데이터 구조는 무엇을 의미합니까? 어떻게이 구조를 만들지 – khaledgg7

+0

'String' 또는'List '. 이 경우 나는'List '쪽으로 기울고있다. – Sedrick

답변

2

파일에서 읽을 수 없으며 동일한 파일에 쓸 수 없습니다. 2 개의 서로 다른 파일이 필요합니다.

while (read line from input file) { 
     if (NOT matches your search pattern) 
      write line to output file. 
     else { // matches 
      write start of line to your search pattern. 
      write your replace string 
      write from end of search pattern to end of line. 
     } 
    } 

바꾸기 문자열이 검색 문자열과 같은 크기가 아니라면 예, 2 개의 파일을 사용해야합니다. 다음 파일을 고려하십시오.

Blah 
Blah 
Blah 

이제 'a'를 "The Quick Brown Fox"로 바꿉니다. 첫 번째 줄을 바꾸면 나머지 파일을 덮어 씁니다. 이제 2 행을 읽을 수 없으므로 2 파일을 사용해야합니다.

+0

나는 이해하지 못한다. 내 코드를 모두 바꿔야한다는 뜻인가? 그리고 만약 내가 같은 파일을 바꾸고 싶다면 어떻게 2 파일을 만드나요? – khaledgg7

+0

기술적으로 동일한 파일을 읽고 쓸 수는 있지만 그렇게하는 것은 쉽지 않습니다. 필터링 라인의 경우 작동 할 수 있습니다. https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html –

+0

@JochenBedersdorfer seek(), yes를 사용하지만 검색 및 바꾸기가 동일한 크기 여야합니다. 그렇지 않으면 갭이 있습니다. –

0

@Sedrick 주석과 코드를 기반으로하는 또 다른 대답은 다음과 같습니다. 의사 코드에 추가하고 있습니다.

File file = new File("C:\\Users....file.txt"); 
Scanner input = new Scanner(System.in); 
System.out.println("Enter the content you want to change:"); 
String Uinput = input.nextLine(); 
System.out.println("You want to change it to:"); 
String Uinput2 = input.nextLine(); 

Scanner scanner = new Scanner(file).useDelimiter(","); 
java.util.List<String> tempStorage = new ArrayList<>(); 

while (scanner.hasNextLine()) { 
    String lineFromFile = scanner.next(); 
    tempStorage.add(lineFromFile); 
} 

// close input file here 
// Open your write file here (same file = overwrite). 

// now loop through temp storage searching for input string. 
for (String currentLine : tempStorage) { 
    if (!lcurrentLine.contains(Uinput)){ 
     String temp = currentLine.replace(Uinput, Uinput2); 
     write a line using temp variable 
    } else { // not replaced 
     write a line using currentLine; 
} 
// close write file here 

그런데 IO 잡화에 대한 트랩 캐치를 사용하여 읽기 쓰기를 처리해야합니다. 그것이 의사 코드라는 것을 알았습니다. 이 웹 사이트에서 파일을 읽고 쓰는 데는 많은 예제가 있습니다. 검색하기 쉽습니다.

+0

도움을 주셔서 감사합니다,하지만이 코드에서 나는 그것을 이해하지 않는 몇 가지 라인이 있습니다. 당신이 의미하는 것 "// 여기에 쓰기 파일을여십시오 (같은 파일 = 덮어 쓰기). "이전 문자열을 변경하기 전에 임시 저장 문자열이 필요하다는 것을 알았지 만 코드를 실행하면이 줄에 문제가 있다는 메시지가 표시됩니다. \t \t \t if (! lcurrentLine.contains (Uinput)) { "lcurrentLine을 (를) 확인할 수 없습니다. \t 구문 오류,"} "ClassBody를 완성하려면" – khaledgg7

+0

고맙습니다. 이제는 if (! lcurrentLine >> currentLine을 변경하고 새로운 FileWriter (file)에서 true를 제거합니다. 도와 주셔서. – khaledgg7

+0

입력이 존재하고 그것을 변경하면 코드가 잘 작동하는 다른 문제가 발견되었지만 파일의 모든 데이터를 정리하지 못했습니다! 문제가 "실제"부분 또는 IOException을 형성한다고 생각합니다 – khaledgg7

관련 문제