DAO类没有写入文件

时间:2017-01-18 03:36:47

标签: java javafx interface dao file-writing

我试图通过使用模型和DAO类将用户写入名为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类(我不能粘贴createUser()方法,因为它链接到类中的其他几个方法):

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();
        }
    }
}

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

我怀疑这个问题可能与不为用户创建任何密码有关,而且由于没有密码字段,它无法写任何内容;但我无法解决这个问题。

此外,模型中没有其他内容很重要;只是一些属性,访问器和mutator,以及一个不包含任何东西的默认构造函数。

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

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;
    }
}

3 个答案:

答案 0 :(得分:4)

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

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。

答案 1 :(得分:0)

System.out.println在调试方面总是你的朋友。我不确定代码是否完整足以让任何人能够给你一个坚实的答复。将printlns放在每个相关方法的开头(或使用调试器并逐步遍历每个区域)。也许用现有用户检查的东西出错了?

答案 2 :(得分:0)

修改了您的User类并添加了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=***}

toString()

中添加了User方法
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()方法

的返回中删除双cotted文本