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 中删除密码和双端文本
我正在尝试通过使用模型和 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()
方法