0

Javaのテキストファイル内の特定のテキストをどのように置き換えるのだろうかと思っていましたか?

たとえば、次の内容のテキスト ファイルがあるとします。

John: My Status is: 0;
William: My Status is: 0;
Andrew: My Status is: 1;
Bob: My Status is: 1;
Smith: My Status is: 0;

そして、文字列「William」を含む行を次のように置き換えたいと思いました"William: My Status is: 1;"

したがって、新しいテキストファイルは次のようになります。

John: My Status is: 0;
William: My Status is: 1;
Andrew: My Status is: 1;
Bob: My Status is: 1;
Smith: My Status is: 0;

私はまだOOPに比較的慣れていないので、助けていただければ幸いです! これは私がこれまでに行った方法です:

  1. ファイルを 1 行ずつ読みます。各行を新しい一時テキスト ファイルに書き込み、追加します。
  2. 行に「William」という単語が含まれている場合は、その行を「William: My status is: 1」に置き換えてから、一時テキスト ファイルに追加します。
  3. 古いテキスト ファイルを一時テキスト ファイルに置き換える

今、私が立ち往生しているビットはステップ 3 です! (私が考えたステップが最も簡単です!)。

コンテンツは一時テキストファイルに正しく書き込まれているようですが、何らかの理由で古いテキストファイルを置き換えることができません! これはこれまでの私の実際のコードです: (読むには多すぎる場合は申し訳ありません。もしそうなら、もし私にいくつかの一般的なアドバイスをいただければ、それも素晴らしいでしょう!)

public void verifyUser(UserDataObject u) {

    String eachline = "";
    String uname = u.getUsername();
    Scanner sc;
    try {
        File file1 = new File("FlatFileStorage.txt");
        sc = new Scanner(file1);

        FileWriter fw = new FileWriter("TempFlatFileStorage.txt", true);
        BufferedWriter bw = new BufferedWriter(fw);
        PrintWriter out = new PrintWriter(bw);

        while (sc.hasNextLine()) {
            eachline = sc.nextLine();

            if ( eachline.contains(uname) ) {
                int lineStart = eachline.indexOf("Username: " + uname);
                int lineEnd = eachline.indexOf("end" + uname + ";");
                int unameLength = uname.length();

                String lineStatus = eachline.substring(lineStart, lineEnd + 4 + unameLength);
                //System.out.println(lineStatus);

                String newLineStatus = lineStatus.replace("VerifyStatus: 0", "VerifyStatus: 1");
                System.out.println(newLineStatus);
                out.println(newLineStatus);

            } else {
            System.out.println(eachline);
            out.println(eachline); }
        }

        out.close();

    } catch (FileNotFoundException e) {
        System.out.println("Error: Could not find database/storage."); } catch (IOException e) {
            System.out.println("There has been an error: " + e.getMessage());
            e.printStackTrace();
    }


File file = new File("FlatFileStorage.txt");
File tempfile = new File("TempFlatFileStorage.txt");
tempfile.renameTo(file);
}
4

3 に答える 3

1
I was just wondering how I would go about replacing a certain bit of a text in a textfile in Java?

この問題は、ランダム ファイル アクセスのようなものです。元のファイルを削除して新しいファイルを作成していないと、これを行うのは困難です。おそらく最初に文字列を検索し、メモリ内で置換してファイルを上書きします。

何をすべきか?

代わりに XML ファイルを使用してください。簡単で効率的な方法XMLparsingがあります。完全な既製のさまざまな例 をここで見つけることができます。レコード タイプのテキストをシンプル テキスト ファイルに保存する代わりに、非常に便利です。

それが役に立てば幸い。

于 2013-07-28T11:50:32.793 に答える
1

一時ファイルを作成する代わりに、このコードを使用できます。
ここでは、一時ファイルを作成する代わりに.
ファイルの内容をStringBuilderオブジェクトに追加し、反復が完了した後、
そのStringBuilderオブジェクトを同じファイルに出力
しました。ここで一時ファイルを作成して古いファイルに名前を変更したり、古いファイルを削除したりする必要がないように、私のコードを調べてください。

    BufferedReader br = new BufferedReader(new FileReader(new File("filepath")));
    String line = null;
    StringBuilder sb =new StringBuilder();
    while ((line = br.readLine())!=null) 
    {
        if(line.indexOf(uname)!=-1)
        {
            //do your logic here
            sb.append("your logic here"+"\n");
        }else{
            sb.append(line+"\n");
        }
    } 
    br.close();
    BufferedWriter bw = new BufferedWriter(new FileWriter(new File("filepath")));
    PrintWriter out = new PrintWriter(bw);
    out.print(sb.toString());
    out.flush();
    out.close();
于 2013-07-28T11:33:01.733 に答える
1

あなたが与えた例、次の行から気づいたように、ロジック(つまり、これを通じて達成したいこと)に他に問題はないと仮定しています:

int lineStart = eachline.indexOf("Username: " + uname); 
int lineEnd = eachline.indexOf("end" + uname + ";"); 
int unameLength = uname.length();

lineStartandに -1 を返すlineEnd

現在の問題を解決するには、sc.close();&を追加しますfile1.delete();

//
//
//Modified Lines
  sc.close();
  out.close();
  file1.delete();             

 } catch (FileNotFoundException e) {
  System.out.println("Error: Could not find database/storage.");
}
//Catch Statement and remaining Code
于 2013-07-28T13:43:06.970 に答える