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. 逐行阅读文件。将每一行写入并附加到一个新的临时文本文件中。
  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

而不是创建临时文件您可以使用此代码。
在这里而不是创建临时文件。
我将文件内容添加到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
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

我假设您的逻辑没有其他问题(即您希望通过此实现的目标),正如我从您提供的示例中注意到的那样,以下几行:

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

返回 -1lineStartlineEnd

要解决您当前的问题,请添加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 回答