2017-01-18 11 views
2

Я пытаюсь сделать систему входа в систему с помощью модели и DAO класса писать пользователей в файл с именем users.txtDAO класса не писать в файл

В мой контроллер, я создал 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(); 
     } 
    } 
} 

Я импортировал все, что нужно импортировать, и все пути правильны. Я попытался удалить текстовый файл и запустить приложение, чтобы узнать, работает ли этот путь, и ему удаётся создать текстовый файл, но он не обновляет файл, ничего не записывая.

Я подозреваю, что проблема может быть связана с не созданием пароля для пользователя, и поскольку в поле пароля нет пароля, он ничего не может написать; но я не могу разобраться в этом.


Кроме того, в модели нет ничего более важного; просто некоторые атрибуты, аксессоры и мутаторы, а также конструктор по умолчанию, который не содержит ничего.


Обновление: Добавлен класс пользователя здесь для справки.

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

Я хотел сделать последний, но после попытки 'uDAO.createUser (это)' та же проблема по-прежнему сохраняется - в текстовом файле ничего не меняется. – cosmo

+0

Вы получаете какие-либо ошибки? – Jobin

+0

Вставьте оператор отладочной печати непосредственно перед out.append(). Список может быть пустым, прежде чем вы узнаете. – Mordechai

ответ

4

При синхронизации пользователей в файл, вы должны близко ваш поток:

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

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

Также убедитесь, что файл существует, в противном случае вы будете бросать FileNotFoundException в ваш getAllUsers() метод.

+0

Это позволило мне написать что-то в файл, хотя я не совсем уверен, что было написано. Текстовый файл теперь содержит следующее: [email protected] Мое намерение заключалось в том, чтобы написать ему имя пользователя и пароль; Я знаю, что я еще не назначил пароль, но он должен по крайней мере показывать «newUser», правильно? – cosmo

+0

@cosmo вам нужно реализовать метод toString() в классе пользователя – mc20

+0

@ mc20 Где именно я должен реализовать этот метод? Я добавил класс User к вопросу для справки. – cosmo

0

System.out.println всегда является вашим другом, когда дело доходит до отладки. Я не уверен, что код достаточно для того, чтобы кто-нибудь мог дать вам твердый ответ. Поместите printlns в начале каждого рассматриваемого метода (или используйте отладчик и пройдите через каждую область). Может быть, что-то с существующей проверкой пользователя идет не так?

+0

Я уже пробовал добавлять утверждения печати к каждому отдельному методу, связанному с исходным методом 'addUser()', и все они успешно напечатан. – cosmo

0

Модифицированный свой класс пользователя и добавлен метод 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 + '}'; 
    } 
} 

, и если вы хотите, только имя пользователя, то удалите пароль, и что двойной cotted текст с возвращением toString() метода

Смежные вопросы