【问题标题】:failing to save data in a text file无法将数据保存在文本文件中
【发布时间】:2012-12-21 21:41:19
【问题描述】:

我正在尝试创建一个从 GUI 获取信息的类,这会将其保存到我用作“数据库”的文本文件中,但由于某种原因,PrintWriter 对象不会将新数据写入文件中。这是我的代码

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class IO {

    File f = new File("DB.txt");
    PrintWriter write;
    Scanner input;
    String[][] data;
    String nameToSearch;

    // search constructor
    public IO(String name) {
        super();
        nameToSearch = name;
        try {
            input = new Scanner(f);
        } catch (FileNotFoundException e) {
            System.out.println("File not found please restart the program");
        }
        data = new String[linesCounter()][2];
        for (int i = 0; i < linesCounter(); i++) {
            data[i][0] = input.nextLine();
            data[i][1] = input.nextLine();
        }
    }

    public IO(String name, String number) {
        try {
            write = new PrintWriter(new FileWriter(f, true));
        } catch (IOException e) {
            System.out.println("Error");
        }
        write.println(name);
        write.println(number);
    }

    int linesCounter() {
        try {
            input = new Scanner(f);
        } catch (FileNotFoundException e) {
            System.out.println("File not found please restart the program");
        }
        int counter = 0;
        while (input.hasNext()) {
            input.nextLine();
            counter++;
        }
        return counter / 2;
    }

    int contactFinder() {
        for (int i = 0; i < linesCounter(); i++)
            if (data[i][0].equalsIgnoreCase(nameToSearch))
                return i;
        return -1;
    }

    String nameGetter() {
        return data[contactFinder()][0];
    }

    String numGetter() {
        return data[contactFinder()][1];
    }

}

【问题讨论】:

  • 可能是它正在写入的文件不在您认为的位置。打印file.getAbsolutePath()看看是否正确

标签: java printwriter


【解决方案1】:

使用printwriter.close()完成写入文件后,您需要关闭打印机

  try {
            write = new PrintWriter(new FileWriter(f, true));
              write.println(name);
              write.println(number);
              write.close();
        } catch (IOException e) {
            System.out.println("Error");
        }

    }

编辑: 对于您的 NoSuchElement 例外,您应该在使用 Scanner.hasNextLine() 调用 Scanner.nextline() 之前检查文件中是否有下一行。

 for (int i = 0; i < linesCounter(); i++) {
      if(input.hasNextLine()){
        data[i][0] = input.nextLine();
        data[i][3] = input.nextLine();
    }
   }

【讨论】:

  • 不,如果它是换行符,并且在这个例子中。
  • 没有@CBredlow,close() 会自动刷新。
  • 像 FindBugs (findbugs.sourceforge.net) 这样的工具会指出问题所在。
  • 添加 write.close();数据已保存:) 现在的问题是,当我在文件中搜索某些内容时,它会抛出此异常“线程“AWT-EventQueue-0”中的异常 java.util.NoSuchElementException:在 java.util.Scanner 处找不到行。 nextLine(Scanner.java:1516) at IO.(IO.java:27) at GUI$Buttonlistener.actionPerformed(GUI.java:49) ' 等等,但我不能在这里写
【解决方案2】:

PrintWriter 可能永远不会被刷新。您可以使用

手动执行此操作
write.flush();

这将确保缓冲区被写入文件。

【讨论】:

  • 错误是我忘记关闭打印机 :) 还是谢谢 :)
  • 我明白了,所以关闭也必须冲洗。很高兴知道。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多