我无法使用ObjectInputStream的readObject()方法从.txt文件读取对象数据。 我正在将多个用户对象写入.txt文件,以在程序服务器关闭时保存用户,并且编写工作正常,尽管当我尝试回读信息时,我不知道如何循环/读取文件中的下一行。
public void readObjectFromFile() {
boolean cont = true;
User user;
try {
FileInputStream fileIn = new FileInputStream("files/userlist.txt");
ObjectInputStream objectIn = new ObjectInputStream(fileIn);
while(cont){
Object obj = objectIn.readObject();
if(obj != null) {
registeredUsers.add((User)objectIn.readObject());
user = (User)obj;
userPasswords.put(user.getUsername(), user.getPassword());
System.out.println(user.getUsername());
}else {
cont = false;
}
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
public void addUserToDatabase(User user) {
try(FileOutputStream fos = new FileOutputStream("files/userlist.txt", true);
ObjectOutputStream oos = new ObjectOutputStream(fos)){
oos.writeObject(user);
oos.write('\n');
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我想逐行读取文件,并将每一行的信息存储在User对象中,并将其存储在registeredUsers列表中。
答案 0 :(得分:0)
好的,我解决了!
public void readUsersFromFile() {
try {
FileInputStream fileIn = new FileInputStream("files/userlist.dat");
ObjectInputStream objectIn = new ObjectInputStream(fileIn);
boolean keepReading = true;
try {
while(keepReading) {
User user = (User)objectIn.readObject();
registeredUsers.add(user);
userPasswords.put(user.getUsername(), user.getPassword());
System.out.println(user.getUsername());
objectIn = new ObjectInputStream(fileIn);
}
}catch(EOFException e) {
keepReading = false;
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
答案 1 :(得分:-1)
问题:您正在while循环中阅读两次。
解决方案:
不要两次调用readObject()方法使用已经获取的引用。
除了功能性问题外,您还可以更正以下内容以使代码更好:
不要让while循环如此复杂。
在while循环中无需使用单独的布尔计数器。
只需多次向用户进行一次类型转换(在readObject()调用自身时)。
请参考以下代码:
User user = null;
while((user = (User) objectIn.readObject()) != null){
registeredUsers.add(user);
userPasswords.put(user.getUsername(), user.getPassword());
System.out.println(user.getUsername());
}
答案 2 :(得分:-1)
您已经从文件中获取数据了吗? 我之前使用管道分隔文件(“ |”)完成了此操作,因此: 值1 |值2 |值3
不确定文件的构成,但是如果您已经在读取数据,则可以跳到下一行并按如下方式创建新的User对象:
private List <UserEntry> collectFileContents(InputStream is, String fileName) throws Exception {
try {
List <UserEntry> userEntries = new ArrayList <UserEntry>();
String line = "";
BufferedReader br = new BufferedReader(new InputStreamReader(is));
br.readLine();
while ((line = br.readLine()) != null) {
if (line.length() > 0) {
UserEntry entry = new UserEntry();
try {
String[] lineValues = line.split("\\|",-1);
entry.setVal1(lineValues[0]);
entry.setVal2(lineValues[1]);
//etc..
userEntries.add(entry);
} catch (ArrayIndexOutOfBoundsException ex) {
//error handling here
continue;
}
}
}
return userEntries;
}catch(Exception ex) {
//error handling here
}
}
这应该创建一个用户列表,然后我用另一种方法将它们保存到数据库中。但是您可以按自己的意愿做。还要注意-在我的文件中,标题行作为第一行。因此,此代码将跳过第一行。同样,不确定文件的设置方式。