【问题标题】:BufferedWriter can't desire change dataBufferedWriter 无法更改数据
【发布时间】:2015-05-10 17:24:42
【问题描述】:

我希望你能帮助我,我正在读取一个多行的文件。我使用 BufferedReader 来分离数据。如果数据 1 与新数据 1 输入不匹配,它将使用 BufferedWriter 将新数据 1 输入替换为旧数据 1。使用以下代码,它确实更改了数据 1,但它附加了其他行数据 2 和 3。我只想更改数据 1,但行保持不变。

Example(Input)

abc, 123, 456, 3345
test, t245, 442, d444
dddd, 4444, ffff, 333

public void test(String DATA1, String DATA2) throws IOException{

    br = new BufferedReader(new FileReader(file));
    while ((CurrentLine = br.readLine()) != null) {

   String[] modify = CurrentLine.split(split);
   String data1 = modify[0];
   String data2 = modify[1];
   String data3 = modify[2];
   String data4 = modify[3];

     bw = new BufferedWriter(new FileWriter(file, true));

    if (!data1.contains(DATA1)) {

    StringBuilder sb = new StringBuilder();

    while(CurrentLine != null){
        sb.append(CurrentLine.replace(data1, DATA1));
        sb.append("\n");
        CurrentLine = br.readLine();

    }

    bw.write(sb.toString());

    RESIDENTS_OLDDETAILS = new File(oldfile);
    RESIDENTS_OLDDETAILS.delete();

    RESIDENTS_NEWDETAILS = new File(newfile);
    RESIDENTS_NEWDETAILS.renameTo(old);

    br.close();
    bw.close();

Example(Output of the above code)

newabc, t245, 442, d444
newabc, t245, 442, d444
newabc, t245, 442, d444

Expected output
aaa, 123, 456, 3345
test, t245, 442, d444
dddd, 4444, ffff, 333

Edited Expected output
aaa, 123, 456, 3345
test, t245, 442, d444
dddd, 4444, ffff, 333aaa, 123, 456, 3345
test, t245, 442, d444
dddd, 4444, ffff, 333

【问题讨论】:

  • 你的预期输出是什么?
  • 您好,已添加。再次感谢您的宝贵时间。
  • file 是否在支持通过来自同一文件的不同文件描述符进行读写的文件系统上?
  • 你好,它会读取一个文件,如果与数据1不匹配,则删除该文件并在新文件中重写。

标签: java arrays file bufferedreader bufferedwriter


【解决方案1】:

看看这些修改,您可能想在检测到它不同后立即替换 data1,然后只需阅读其余行并将它们附加到您的 StringBuilder

public static void main(String[] args) throws Exception {
    test("aaa", "bbb");
}

public static void test(String DATA1, String DATA2) throws IOException {
    String file = "data.txt";
    String newFile = "dataNew.txt";
    
    String CurrentLine = "";
    BufferedReader br = new BufferedReader(new FileReader(file));
    while ((CurrentLine = br.readLine()) != null) {

        String[] modify = CurrentLine.split(", ");
        String data1 = modify[0];
        String data2 = modify[1];
        String data3 = modify[2];
        String data4 = modify[3];

        BufferedWriter bw = new BufferedWriter(new FileWriter(newFile, true));

        if (!data1.contains(DATA1)) {
            StringBuilder sb = new StringBuilder();
            sb.append(CurrentLine.replace(data1, DATA1));
            sb.append("\n");

            while ((CurrentLine = br.readLine()) != null) {
                sb.append(CurrentLine);
                sb.append("\n");
            }

            bw.write(sb.toString());

            File RESIDENTS_OLDDETAILS = new File(file);
            RESIDENTS_OLDDETAILS.delete();

            File RESIDENTS_NEWDETAILS = new File(newFile);
            RESIDENTS_NEWDETAILS.renameTo(RESIDENTS_OLDDETAILS);

            br.close();
            bw.close();
            break;
        }
    }
}

输入:

abc, 123, 456, 3345

测试,t245、442、d444

dddd, 4444, ffff, 333

输出:

aaa, 123, 456, 3345

测试,t245、442、d444

dddd, 4444, ffff, 333

【讨论】:

  • 嗨,不幸的是它并没有改变data1,而是将第二行和第三行重新写入文件。
  • @javasimple 更新了答案。我刚刚调用了我的文件 data.txt 和 dataNew.txt。显然使用您的数据文件名。
  • 您好,非常感谢,但它确实改变了data1,不知何故又重写了。另外,是否可以在相同的文本文件名中进行修改?
  • @javasimple 我提供的答案就是这样做的。查看您编辑的代码与我发布的答案之间的区别。它们不一样。
  • 谢谢,这是我的错。是否可以编辑成相同的文件名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多