Comment puis-je écrire plusieurs objets à la serializable de fichiers et les lire lorsque le programme est utilisé à nouveau?
Je veux maintenir la base de données des utilisateurs d'une Banque pour mon projet. Je suis en mesure d'enregistrer le nombre d'utilisateurs dans un serializable fichier. Mais quand j'essaie d'enregistrer l'utilisateur de base de données, il ajoute seulement le dernier de la base de données.
Ci-dessous est le pic de code qui écrit les objets:
if(e.getSource()==submit) {
if(uFName != null && uLName != null && uInitialDeposit !=0) {
if(uAccountType=="Savings") {
Random randomGenerator = new Random();
//Gets the number of users from file if file exists
File f = new File(fileNameAdmin);
if(f.exists() && !f.isDirectory()) {
admin=db.readFromAdminDatabase();
}
u[admin.numberOfUsers]= new User();
u[admin.numberOfUsers].fName=uFName;
u[admin.numberOfUsers].lName=uLName;
u[admin.numberOfUsers].initalDeposit=uInitialDeposit;
u[admin.numberOfUsers].interestRate=uInterestRate;
u[admin.numberOfUsers].accountType="Saving";
u[admin.numberOfUsers].accountNumber=690000+admin.numberOfSavingsAccount;
//Generates a 4 digit random number which will be used as ATM pin
u[admin.numberOfUsers].atmPin=randomGenerator.nextInt(9999-1000)+1000;
//A savings account will be created
sa[admin.numberOfSavingsAccount]=new SavingsAccount(u[admin.numberOfUsers].accountNumber,u[admin.numberOfUsers].fName,u[admin.numberOfUsers].lName,
u[admin.numberOfUsers].initalDeposit,
u[admin.numberOfUsers].interestRate);
u[admin.numberOfUsers].sa=sa[admin.numberOfSavingsAccount];
System.out.println(u[admin.numberOfUsers].sa.balance);
JOptionPane.showMessageDialog(submit,"Congratulations! You are now a member of Symbiosis Bank."
+ "\nYour account number is "+u[admin.numberOfUsers].accountNumber
+" and your ATM Pin is "+u[admin.numberOfUsers].atmPin,"Account Created",JOptionPane.INFORMATION_MESSAGE);
try {
//for(int j = 0; j<admin.numberOfUsers; j++)
db.addUserToDatabase(u[admin.numberOfUsers]);
admin.numberOfSavingsAccount++;
admin.numberOfUsers++;
db.updateAdminDatabase(admin);
dispose();
setVisible(false);
//Welcome welcome = new Welcome();
//welcome.setVisible(true);
InitialInput back = new InitialInput();
back.setVisible(true);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
La base de données de la classe qui a des fonctions pour écrire dans la base de données:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Database implements Serializable {
String fileName = System.getProperty("user.home")+"/db.ser";
String fileNameAdmin = System.getProperty("user.home")+"/admindb.ser";
public void addUserToDatabase(User u){
FileOutputStream fos;
try {
fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(u);
oos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("finally")
public User readFromUserDatabase() {
FileInputStream fis;
User temp = null;
try {
fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
temp = (User)ois.readObject();
//System.out.println(temp.fName);
ois.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
return temp;
}
}
public void updateAdminDatabase(Administrator admin) {
FileOutputStream fos;
try {
fos = new FileOutputStream(fileNameAdmin);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(admin);
oos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("finally")
public Administrator readFromAdminDatabase() {
FileInputStream fis;
Administrator temp = null;
try {
fis = new FileInputStream(fileNameAdmin);
ObjectInputStream ois = new ObjectInputStream(fis);
temp = (Administrator)ois.readObject();
//System.out.println(temp.fName);
ois.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
return temp;
}
}
}
Le code qui est en train d'essayer de lire la base de données:
public void actionPerformed(ActionEvent e) {
if(e.getSource()==deposit) {
//Ask the amount to deposit
int userAmountToDeposit;
try {
for(int i = 0; i<=admin.numberOfUsers; i++) {
u[i] = db.readFromUserDatabase();
System.out.println(u[i].accountNumber);
}
for(int j =0; j<=admin.numberOfUsers; j++) {
if(u[j].accountNumber==userAccountNumber) {
if(u[j].atmPin==userPin) {
u[j].accountBalance=u[j].sa.balance;
u[j].sa.deposit(10);
u[j].accountBalance=u[j].sa.balance;
System.out.println(u[j].accountBalance);
}
}
}
}
Personnels poignée: la Sérialisation est un mauvais choix pour le stockage à long terme des objets, il n'était tout simplement pas conçu pour cela. Si un seul utilisateur de la base de données est hors de question, alors je suggère d'avoir un coup d'oeil à JAXB au lieu
Malheureusement, je suis venu trop loin pour passer à JAXB. Ce serait formidable si vous pouviez m'aider avec ce sans JAXB. @MadProgrammer
Habituellement, vous devez utiliser une vraie base de données pour le stockage à long terme d'objets, comme faire de la sérialisation comme cela va devenir difficile à maintenir que votre programme se développe. Il y a quelques belles implémentations de Sqlite pour java, ce qui vous donnera une base de données dans un seul fichier. Mais si c'est trop tard pour mettre en œuvre une base de données appropriée, c'est compréhensible.
Je ne peut vraiment comprendre l'inconvénient de Sérialisation. Mais le problème est qu'il sera très difficile de passer à un autre concept comme JAXB que je dois présenter mon projet demain. Et aussi loin que l'utilisation à long terme, ce programme ne sera pas utilisé à long terme. @JonasCz
Votre code crée un fichier et écrit un objet. Si vous voulez écrire plusieurs objets d'un fichier, il suffit de le faire. Sait pas ce que la difficulté avec ce qui est.
Malheureusement, je suis venu trop loin pour passer à JAXB. Ce serait formidable si vous pouviez m'aider avec ce sans JAXB. @MadProgrammer
Habituellement, vous devez utiliser une vraie base de données pour le stockage à long terme d'objets, comme faire de la sérialisation comme cela va devenir difficile à maintenir que votre programme se développe. Il y a quelques belles implémentations de Sqlite pour java, ce qui vous donnera une base de données dans un seul fichier. Mais si c'est trop tard pour mettre en œuvre une base de données appropriée, c'est compréhensible.
Je ne peut vraiment comprendre l'inconvénient de Sérialisation. Mais le problème est qu'il sera très difficile de passer à un autre concept comme JAXB que je dois présenter mon projet demain. Et aussi loin que l'utilisation à long terme, ce programme ne sera pas utilisé à long terme. @JonasCz
Votre code crée un fichier et écrit un objet. Si vous voulez écrire plusieurs objets d'un fichier, il suffit de le faire. Sait pas ce que la difficulté avec ce qui est.
OriginalL'auteur Udit Chugh | 2015-05-03
Vous devez vous connecter pour publier un commentaire.
Aussitôt à écrire et à lire plusieurs objets s'il vous plaît essayer comme ci-dessous
L'écriture de plusieurs objet dans la Liste
La lecture de tous les objets à partir d'un fichier
Ici getvalues() est la méthode présente dans Writeobject classe. Suivez le même mécanisme de votre extrait de code
N'utilisez pas de citer la mise en forme de texte qui n'est pas cité.
Il fonctionne très bien, mais de cette façon, l'ensemble de l'Objet est stocké dans la mémoire, ce qui n'en fait pas une chance solution dans tous les cas.
OriginalL'auteur Mohan Raj
Si vous voulez réparer rapidement, vous pouvez créer une liste et de les stocker d'abord et avant tout des objets de la liste (peut-être ArrayList ou une Liste), et ensuite vous pourrez enregistrer cette liste sur votre fichier. C'est la méthode du nice. Assurez-vous que vos objets sont sérialisables.
public static void saveVehiculeInFile(ArrayList vehiculeList) {
OriginalL'auteur Blue Like