我在使用ObjectInputStream的readObject()-method从.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-object中,并将其存储在registeredUsers-list中。
发布于 2019-04-12 13:43:01
好了,我解决了!
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();
}
}发布于 2019-04-11 23:14:55
问题:你在while循环中读了两次。
objectIn.readObject()
registeredUsers.add((User)objectIn.readObject());
解决方案:
不要两次调用readObject()方法,使用已经获取的引用。
除了功能问题以外,您还可以更正以下内容以使代码更好:
请参考以下代码:
User user = null;
while((user = (User) objectIn.readObject()) != null){
registeredUsers.add(user);
userPasswords.put(user.getUsername(), user.getPassword());
System.out.println(user.getUsername());
}发布于 2019-04-11 23:55:04
你已经从文件中获取数据了吗?我以前用竖线分隔的文件("|")这样做过,所以: value1|value2|value3
不确定您的文件的构成,但是如果您已经在读取数据,那么可以跳到下一行,创建新的用户对象,如下所示:
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
}
}这应该会创建一个用户列表,我会用另一种方法将它们保存到数据库中。但是你可以随心所欲地去做。同样值得注意的是-在我的文件中,我有一个标题行作为第一行。所以这段代码将跳过第一行。同样,不确定您的文件是如何设置的。
https://stackoverflow.com/questions/55635360
复制相似问题