【问题标题】:How to get the BufferedWriter to write to a text file?如何让 BufferedWriter 写入文本文件?
【发布时间】:2017-07-21 13:14:53
【问题描述】:

我正在尝试用 Java 制作预约簿程序,但是 BufferedWriter 似乎没有写入文件。

这段代码都在 try { } catch (FileNotFoundException) { } catch (IOException) { } 块内

FileWriter writer = new FileWriter("Appointments" + name + ".txt", true);
BufferedWriter bufferedWriter = new BufferedWriter(writer);

if (open == 'o') {
    FileReader reader = new FileReader("Appointments" + name + ".txt");
    BufferedReader bufferedReader = new BufferedReader(reader);
    while ((line = bufferedReader.readLine()) != null) {
        if (line.indexOf("one-time") == line.length() - 8) {
            OneTime o = fromStringOneTime(line);
            oneTimes.add(o);
        }
        if (line.indexOf("daily") == line.length() - 5) {
            Daily d = fromStringDaily(line);
            dailys.add(d);
        }
        if (line.indexOf("monthly") == line.length() - 7) {
            Monthly m = fromStringMonthly(line);
            monthlys.add(m);
        }
    }
}

while 循环只是将文件中当前的所有值初始化为 3 个不同的 ArrayList。

然后,我有一段代码可以在您选择要添加约会后创建新对象(变量descdate 之前已定义):

System.out.print("Enter if this is a (o)ne-time, (d)aily, or (m)onthly appointment: ");
freq = scanner.next().charAt(0);
if (freq == 'o') {
    OneTime o = new OneTime(desc, date.getDate());
    oneTimes.add(o);
    totalCount++;
    bufferedWriter.write(o.toString());
    bufferedWriter.newLine();
    valid = true;
} else if (freq == 'd') {
    Daily o = new Daily(desc, date.getDate());
    dailys.add(o);
    totalCount++;
    bufferedWriter.write(o.toString());
    bufferedWriter.newLine();
    valid = true;
} else if (freq == 'm') {
    Monthly o = new Monthly(desc, date.getDate());
    monthlys.add(o);
    totalCount++;
    bufferedWriter.write(o.toString());
    bufferedWriter.newLine();
    valid = true;
}

在 try 块的末尾,我有 reader.close()writer.close() 行。那么为什么当我检查它应该保存到的文件时,它仍然显示为空白?这是我第一次处理文件保存,所以我不确定为什么它没有按应有的方式工作。

编辑:文件现在只会在选择打开现有文件而不是创建新文件的选项时读取

【问题讨论】:

  • 在大多数操作系统中,您不能同时读取和写入文件。
  • 那么,如果我在使用完阅读器后立即关闭阅读器,它会起作用吗?因为我只需要在初始化时使用它,所以在我发布的第一块代码中。
  • 你能不能尝试用不同的文件名写入一个文件并在程序结束时重命名它
  • 我将如何使用阅读器/编写器来做到这一点?另外,请记住,我需要将文本附加到已读取的文件中,因此不能选择仅拥有两个独立文件。
  • 1) 我可以看一看这些课程(一次性、每日或每月)吗? 2)您使用的是记事本还是 IDE(如果是 IDE,是哪一个?)

标签: java bufferedreader filereader filewriter bufferedwriter


【解决方案1】:

是的。大多数操作系统不允许读写同一个文件。因此,您可以通过使用一些临时文件名写入文件并在程序末尾将其重命名为原始文件来解决此问题

try {
   FileWriter writer = new FileWriter("Appointments" + name + "1.txt", true);
   FileReader reader = new FileReader("Appointments" + name + ".txt");
   BufferedReader bufferedReader= new BufferedReader(reader);
   BufferedWriter bufferedWriter = new BufferedWriter(writer);
   .......
} catch () {
   ......
} finally {
   bufferedReader.close();
   bufferedWriter.flush();
   bufferedWriter.close();
}

// Rename the file and delete temp file
File srcFile = new File("Appointments" + name + "1.txt");
File targerFile = new File("Appointments" + name + ".txt");
srcFile.renameTo(targetFile);
srcFile.delete();

【讨论】:

  • 试过了,文件还是空的。附加了1 的第二个文件已创建,但我从未看到其中存储任何内容。
  • 你是否为 bufferedWriter 调用了 flush() 或 close() ?
  • 是的,我给他们两个都打过电话。
  • 由于无法获得完整的源代码,因此很难确定问题所在。您可以做一件事,①只需将一些值硬编码到 bufferedWriter.write() 并尝试,因为现在是全新的文件名,并且不依赖于您的阅读器或任何其他逻辑。如果它有效,请检查您的数据形成的逻辑。
  • bufferedWriter 未在您的源代码中关闭。你能打电话给 bufferedWriter.close();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多