2017-12-15 6 views
0

スキャナクラスのテキストファイルで特定のテキスト(単語など)を検索できるこのコードを記述しますが、新しいテキスト)を同じ古いテキストの場所に表示します。 インターネットで、(replaceAll(old、new);) のようなreplaceAllメソッドを使用する必要がありますが、スキャナクラスでは機能しません。スキャナクラスのテキストファイルの特定のテキストを変更する

これは私のコードです。古い行を変更せずに新しい行に新しいテキストを書き込むだけです(存在する場合)。

私は(データを取得するために)フォームスキャナを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

'文字列'または 'リスト'を作成します。この場合、私は '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 

ちなみに、IOExceptionを捕まえるためにtry catchを使用して読み込み書き込みを囲む必要があります。それが私がそれが疑似コードであることを知っていた方法です。このウェブサイトには、ファイルを読み書きするための例がたくさんあります。検索するのは簡単です。

+0

助けてくれてありがとうが、私はそれを理解していないこのコードにいくつかの行があります。あなたは何を意味するのですか?//ここにあなたの書き込みファイルを開きます(同じファイル=上書きする)。 "古い文字列を変更する前に一時記憶ストリングが必要になったことを理解しましたが、コードを実行するとこの行に問題があると表示されます\t \t \t if(!lcurrentLine.contains(Uinput)){ "lcurrentLineを解決できません \t構文エラー、"} "を入力してClassBodyを完成させよう" – khaledgg7

+0

これは今、うまく動いているので、if(!lcurrentLine >>!currentLineと私はtrueを取り除きます(新しいFileWriter(file)); – khaledgg7

+0

私は別の問題を発見しました。入力が存在し、それを変更した場合、コードは正常に動作しますが、ファイル内のすべてのデータが消去されません!!問題は "真"な部分かIOExceptionですか? – khaledgg7

関連する問題