用Java中的新文本文件替换旧文本文件

时间:2013-07-28 11:25:51

标签: java file-io

我只是想知道如何用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: My Status is: 1;"

替换包含字符串“William”的行

因此,新文本文件应如下所示:

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. 将我的旧文本文件替换为临时文本文件
  4. 现在我坚持的是第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);
    }
    

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

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

这个问题就像随机文件访问一样。如果您没有删除原始文件并创建一个新文件,则很难做到。可能首先搜索字符串,然后在内存中替换覆盖文件。

怎么办?

请改用XML文件。有一种简单有效的方法 XMLparsing 。您可以找到完整的现成的示例 here。它非常有用,而不是在简单文本文件中保存记录类型文本。

希望它有所帮助。

答案 2 :(得分:1)

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

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