簡體   English   中英

在Java中用新的文本文件替換舊的文本文件

[英]Replacing an old textfile with a new textfile in Java

我只是想知道如何替換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. 逐行讀取文件。 將每一行寫入並追加到新的臨時文本文件中。
  2. 如果該行包含單詞“ William”,則將其替換為“ William:我的狀態是: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);
}

您可以使用此代碼來代替創建臨時文件
在這里而不是創建臨時文件。
我將文件內容添加到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();
I was just wondering how I would go about replacing a certain bit of a text in a textfile in Java?

此問題就像隨機文件訪問一樣。 如果您沒有刪除原始文件並制作一個新文件,則很難做到。 可能首先搜索字符串,然后在內存中查找 替換覆蓋文件。

該怎么辦?

請改用XML文件。 有一個簡單有效的方法XMLparsing 您可以在此處找到完整的現成的不同示例 這非常有幫助, 而不是將記錄類型的文本保存在“簡單文本”文件中。

希望能幫助到你。

我假設您在邏輯上沒有其他問題(即您希望通過此實現的目標),正如我從您提供的示例中注意到的那樣,以下幾行:

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

返回-1到lineStartlineEnd

要解決您當前的問題,請添加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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM