Я пробовал много разных кодов для этого, но ничего не работает. .Сохранение информации пользователя в файле и получение этой информации
Im пытается сделать простое приложение, которое может регистрировать пользователей и сохранять информацию и использовать ее войти в У меня есть класс с именем записи в файл:
public class WriteToFile {
Vector<Account> massAccount = new Vector<>();
public File openFile(File path, String fileName) throws IOException {
File f = new File(path, fileName);
f.createNewFile();
return f;
}
public String getFileData(File f) {
String res = "";
res = f.getAbsolutePath() + "\n";
res += f.length() + "\n";
res += new java.util.Date(f.lastModified());
return res;
}
public void writeToFile(File f, String data) throws IOException {
FileWriter fw = new FileWriter(f);
fw.write(data);
fw.close();
}
public String readFromFile(File f) throws IOException {
FileReader fr = new FileReader(f);
int size = (int)f.length();
char[] res = new char[size];
fr.read(res);
return new String(res);
}
public void writeObject(File f, String user, String pass, String question, String answer, Vector<Account> mass) throws IOException {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
Account acc;
acc = new Account(user, pass,question, answer);
out.writeObject(acc);
for (Account accou: mass){
out.writeObject(accou);
}
out.close();
}
public Object readObject(File f, String accName) throws IOException
{
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
Account acc;
String res = "";
try {
while(true)
{
acc = (Account) in.readObject();
if(acc.getUsername().equals(accName))
return acc;
}
}
catch(EOFException e)
{
res = res + "End Of Records";
}
catch(ClassNotFoundException e){}
return res;
}
public Vector<Account> readAllObjects(File f) throws IOException{
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
Account acc;
String res = "";
try{
while(true){
acc = (Account) in.readObject();
massAccount.add(acc);
}
}
catch (EOFException e){
res = res + "End of Records";
}
catch (ClassNotFoundException e){
}
return massAccount;
}
}
И от того, что я понял от использования файлы должны быть в порядке, но, похоже, это не работает.
Например, если я пытаюсь сделать новый файл и чтение из него здесь:
public class RegisterActivity extends AppCompatActivity {
private EditText user, pass, hint, hintans, confirm;
private Button Regi;
private String saveUser = "", savePass = "", saveHint = "", checkUser = "" , checkPass = "", saveAns = "", confirmpass = "";
private WriteToFile writeToFile;
private File f;
private Account AccInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
user = (EditText)findViewById(R.id.regUser);
pass = (EditText)findViewById(R.id.regPass);
Regi = (Button)findViewById(R.id.btncon);
hint = (EditText)findViewById(R.id.regHint);
hintans = (EditText)findViewById(R.id.hintAnswer);
confirm = (EditText)findViewById(R.id.btnConPass);
writeToFile = new WriteToFile();
Regi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
File dir = getFilesDir();
f = writeToFile.openFile(dir, "User.txt");
saveUser = user.getText().toString();
savePass = pass.getText().toString();
saveHint = hint.getText().toString();
saveAns = hintans.getText().toString();
confirmpass = confirm.getText().toString();
AccInfo = (Account)writeToFile.readObject(f,saveUser);
if(AccInfo.getUsername().equals(saveUser))
Toasty("Username already Exists.");
if(savePass.equals(""))
Toasty("Cannot leave password line empty.");
else if(!savePass.equals(confirmpass)){
Toasty("Passwords don't match!");
}
else{
writeToFile.readAllObjects(f);
writeToFile.writeObject(f, saveUser, savePass, saveHint, saveAns, writeToFile.readAllObjects(f));
Toasty("You have successfully registered!");
Intent i = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(i);
}
}
catch (IOException e){
Log.d("Error", "Regi onclick");
}
}
});
}
private void Toasty(String word){
Toast.makeText(RegisterActivity.this, word, Toast.LENGTH_SHORT).show();
}
}
Я всегда получаю IOException, поэтому им угадать мой код в порядке, но я делаю что-то неправильно с помощью файлов.
Любая помощь будет очень признательна.
Благодаря
EDIT: я, возможно, удалось сузить проблему. Когда я вызываю этот метод;
AccInfo = (Account)writeToFile.readObject(f,saveUser);
я получаю:
Regi onclick: null
java.io.EOFException
at libcore.io.Streams.readFully(Streams.java:83)
at java.io.DataInputStream.readShort(DataInputStream.java:152)
atjava.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2061)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:371)
at merccorp.worklist.WriteToFile.readObject(WriteToFile.java:69)
at merccorp.worklist.RegisterActivity$1.onClick(RegisterActivity.java:55)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Что приводит к:
public Object readObject(File f, String accName) throws IOException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
Account acc;
String res = "";
try {
while(true) {
acc = (Account) in.readObject();
if(acc.getUsername().equals(accName))
return acc;
}
}
catch(EOFException e) {
return acc = new Account("Default","secretPass","","");
}
catch(ClassNotFoundException e){}
return acc = new Account("Default","secretPass","","");
}
И это указывает на первую строку:
ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));
Я понятия не имею, что им делать неправильно. И им жаль, что количество кода, но im чрезвычайно озадачено тем, что вызывает это.
Еще раз спасибо!
Не могли бы вы опубликовать трассировку стека, где вы получите IOException? – JonasCz
И в методе getFileData вы должны использовать StringBuilder, например ... Когда вы вызываете concinating на Srings, каждый concat создает новый объект String и другой для результата (плюс один для старого значения) .... Попробуйте использовать StringBuilder, добавьте строки и, наконец, просто вызовите toString() при возврате. – Hrabosch
Где вы поймаете IOException вместо Log.d («Ошибка», «Regi onclick»); попробуйте Log.d («Ошибка», e.getMessage()); Таким образом, вы увидите, что случилось. –