为什么java中的.txt文件在我运行程序时总是变成空的?

trnvg8h3  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(652)

我试图读入一个.txt文件,该文件充当java程序中的数据库。在通过textedit和使用javafilewriter类运行程序之前,我已经写入了文件,但是在运行这些代码行之后,程序仍然显示空数组。当我使用arraylist作为临时数据库时,这是唯一产生问题的部分,代码的其余部分(这里没有显示)运行得非常好。有人能帮我找出为什么.txt文件总是空的吗?

String filePathName = "User Data.txt";
File userFile = new File(filePathName);

if (userFile.createNewFile()) {
    System.out.println("Database has been successfully created");
    System.out.println();
}

Scanner fileReader = new Scanner(userFile);
FileWriter fileWriter = new FileWriter(userFile);
Scanner userInput = new Scanner(System.in);
ArrayList<User> userInfo = new ArrayList<>();
boolean actionValid = false;

StringBuilder fileInput = new StringBuilder();
while (fileReader.hasNext()) {
    fileInput.append(" ").append(fileReader.next());
}

String[] fileList = fileInput.toString().split(" ");

System.out.println(Arrays.toString(fileList));
wgxvkvu9

wgxvkvu91#

解释

你有

Scanner fileReader = new Scanner(userFile);
FileWriter fileWriter = new FileWriter(userFile);

所以你的读者和作者都和 userFile . 虽然这已经是一个坏主意开始(他们会相互干扰),在这种特殊情况下,它也会导致你的问题。
原因是因为 new FileWriter(userFile) 将在文件开始写入之前截断它。因此,文件也为空 fileReader 立即。

解决方案

你可以打开一个 FileWriter 通过添加 true 作为第二个参数(请查看文档),但正如前面所说,更大的问题是,读写器同时绑定到同一个资源。
我没看到你用 fileWriter 在代码段中。因此,我建议你首先完成你所有的阅读和创作 fileWriter 稍后,当你真的需要它时,在你读完它之后。
如果您真的想同时读写,您应该在 List<String> 先把实际的写作推迟到你写完的那一刻。

nio公司

最后一个注意事项是,我们更喜欢使用nio进行此类文件操作。它使用起来简单得多,而且还可以确保流的开放时间不会超过需要的时间。

评论

我觉得这部分很奇怪:

StringBuilder fileInput = new StringBuilder();
while (fileReader.hasNext()) {
    fileInput.append(" ").append(fileReader.next());
}

String[] fileList = fileInput.toString().split(" ");

您正在读取文件并准备 StringBuilder 只是为了再次分割结果。这太浪费了。实际上你应该用的是 List :

List<String> fileList = new ArrayList<>();
while (fileReader.hasNext()) {
    fileList.add(fileReader.next());
}

使用nio,您可以扔掉扫描仪,简化为:

List<String> fileList = Files.lines(userFile.toPath())
    .collect(Collectors.toList());

相关问题