DAO Class 没有写入文件

DAO Class not writing to file

我正在尝试通过使用模型和 DAO class 将用户写入名为 users.txt

的文件来创建登录系统

在我的控制器中,我创建了一个 initialize 方法:

public void initialize(){
    User user = new User();
    user.addUser();
}

这是我模型中包含 addUser() 方法的部分:

public void addUser() {
    User newUser = new User();
    UserDAO uDAO = new UserDAO();
    uDAO.createUser(newUser);
}

这是我的 DAO class(我不能只粘贴 createUser() 方法,因为它链接到 class 中的其他几个方法):

package Server;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Scanner;

public class UserDAO implements UserDAOInterface {

    private static final String User_File = "users.txt";
    private File dataFile;

    public UserDAO() {
        Path dPath = FileSystems.getDefault().getPath("src/MainMenu",User_File);
        dataFile = new File(dPath.toString());
    }

    public ArrayList<User> getAllUsers() {
        Scanner sc;
        String record = null;
        String[] fields;
        ArrayList<User> users = new ArrayList<User>();

        try {
            sc = new Scanner(dataFile);
            while (sc.hasNextLine()) {
                record = sc.nextLine();
                fields = record.split(";");
                String username = fields[0];
                String password = fields[1];
                User u = new User();
                users.add(u);
            }
        } catch (FileNotFoundException e) {
            System.out.println("No record found!");
            //e.printStackTrace();
        }
        return users;
    }

    public User getUser(String username) {
        ArrayList<User> users = getAllUsers();
        User user = null;
        for (User u: users) {
            if (u.getUsername().equals(username)) {
                user = u;
                break;
            }
        }
        return user;
    }

    public boolean createUser(User user) {
        boolean existing = false;
        ArrayList<User> users = getAllUsers();
        for (User u: users) {
            if (u.getUsername().equals(user.getUsername())) {
                existing = true;
                break;
            } 
        }
        if (!existing) {
            users.add(user);
            synToFile(users);
        }
        return !existing;
    }

    public void updateUser(User user) {
        ArrayList<User> users = getAllUsers();
        for (int i = 0; i < users.size(); i++) {
            User u = users.get(i);
            if (u.getUsername().equals(user.getUsername())){
                 users.set(i, user);
            }
        }
        synToFile(users);
    }

    public void deleteUser(User user) {
        ArrayList<User> users = getAllUsers();
        User delUser = null;
        for (User u: users) {
            if (user.getUsername().equals(u.getUsername())){
                delUser = u;
                break;
            }
        }
        if (delUser != null) {
            users.remove(delUser);
            synToFile(users);
        } 
    }

    public void synToFile(ArrayList<User> userList) {
        if (userList == null) {
            return;
        }

        try {
            FileWriter out = new FileWriter(dataFile);
            for (User u: userList) {
                out.append(u.toString() + "\n");
        }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我已经导入了我需要导入的所有内容,所有路径都是正确的。我已尝试删除文本文件和 运行 应用程序以查看路径是否有效,它确实设法创建了文本文件,但它不会通过写入任何内容来更新文件。

我怀疑这个问题可能与没有为用户创建任何密码有关,并且由于没有密码字段,所以无法写入任何内容;但我想不出解决这个问题的方法。


此外,模型中的其他内容都不重要;只是一些属性、访问器和修改器,以及一个不包含任何内容的默认构造函数。


更新:在此处添加了用户class以供参考。

package Server;


public class User {

    private String username;
    private String password;

    public User() {

    }

    public void addUser() {
        User newUser = new User();
        UserDAO uDAO = new UserDAO();
        uDAO.createUser(newUser);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

将用户同步到文件时,您需要关闭您的流:

try {
  FileWriter out = new FileWriter(dataFile);
  for (User u: userList) {
     out.append(u.toString() + "\n");
  }
  out.close(); // <- new!

} catch (IOException e) {
   e.printStackTrace();
} 

还要确保您的文件存在,否则您将在 getAllUsers() 方法中抛出 FileNotFoundException。

System.out.println 在调试方面永远是你的朋友。我不确定代码是否完整到足以让任何人都能够给你一个可靠的答复。将 printlns 放在每个有问题的方法的开头(或使用调试器并单步执行每个区域)。也许现有用户检查出了问题?

修改了您的用户 class 并向其添加了 toString 方法,以便您可以使用此方法打印用户对象

像这样

//Create New user
User user=new User();
user.setUsername("XYZ User");
user.setPassword("****");

//print the created user
System.out.println(user.toString());

输出将是

User{username=XYZ User, password=***}

User class

中添加了 toString() 方法
package Server;


public class User {

    private String username;
    private String password;

    public User() {

    }

    public void addUser() {
        User newUser = new User();
        UserDAO uDAO = new UserDAO();
        uDAO.createUser(newUser);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //toString() method which will return the String representation of User 
    @Override
    public String toString() {
        return "User{" + "username=" + username + ", password=" + password + '}';
    }
}

如果您只需要用户名,则从 toString() 方法

的 return 中删除密码和双端文本