我试图通过使用模型和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;
}
}
答案 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()
方法