Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Perzistencija na fajl

[es] :: Java :: Perzistencija na fajl

[ Pregleda: 2675 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Perzistencija na fajl09.10.2007. u 17:21 - pre 201 meseci
Zdravo svima!
Imam problem sa cuvanjem podataka na fajl. Moram da razvijem web aplikaciju koja ce podatke umesto u bazi,
cuvati na fajlu. Opet imam metodu save(), ali ona nema komunikaciju sa bazom, nego sa fajlom, evo kako sam je resio:
Code:

public class Fax implements Serializable{
...
 public boolean save() {
       boolean saved = false;
       
       try {
       ObjectOutputStream faxOos = new ObjectOutputStream(new FileOutputStream("db/faxDb.tmp", true));
       faxOos.writeObject(new Fax());
       faxOos.close(); 
           saved = true;
       } 
       catch (Exception e) {
            e.printStackTrace();
            saved = false;
       }
       return saved;
       }
       

i ta metoda snimi u fajl objekat Fax-a, ali problem je kada moram to iscitati iz fajla, za to sam napisao metodu loadAll:
Code:

public class Fax implements Serializable{
...  
public static Vector loadAll(){
        
       Vector allFax = new Vector();
       try {
            ObjectInputStream faxOis = new ObjectInputStream(new FileInputStream("db/faxDb.tmp"));
            while(true){
                try{
            allFax.addElement(faxOis.readObject());
            
                } catch (EOFException e){
                    return allFax;  
                }
            }
        catch (Exception e) {
            e.printStackTrace();
            allFax = null;
        }
        return allFax;
    }

ali izbacuje StreamCorruptedException. Svaka sugestija je dobrodosla! Ps. Probao sam i:
Code:

public static Vector loadAll(){
        
       Vector allFax = new Vector();
       try {
            ObjectInputStream faxOis = new ObjectInputStream(new FileInputStream("db/faxDb.tmp"));
            while (true){ 
                Object obj = faxOis.readObject();  
                if (obj instanceof Fax )
                    
                
                break;   
                allFax.add(obj);
                }
                } 
        catch (Exception e) {
            e.printStackTrace();
            allFax = null;
        }
        return allFax;
    }

ali onda bas nista ne uradi...
Pozdrav!
Milan

Milan
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.cisco.com.



+8 Profil

icon Re: Perzistencija na fajl09.10.2007. u 17:41 - pre 201 meseci
Amm..

Ali zasto u petlji pokusavas da iscitas podatke?
Ako zelis da upisujes vise faxova u taj stream, serializuj/deserijalizuj odjednom ceo vektor, umesto sto u petlji pokusavas da ih iscitas jedan po jedan.

Evo primer:
http://www.rgagnon.com/javadetails/java-0075.html




If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl09.10.2007. u 19:01 - pre 201 meseci
Probao sam tako nesto, sve da stavljam u Vector pa da onda njega serijalizujem, ali mi je stalno izlazio EOFExcepption...
Nisam probao da mi klasa kao sto je Fax nasledjuje Vector, kao u primeru sto si mi poslala, jer bih onda svaka moja klasa morala da nasledjuje Vector, i kako bih onda realizovao "normalna" nasledjivanja koja su mi potrebna u modelu, kada java ne dozvoljava visestruka nasledjivanja...
Pozdrav!
Milan
Milan
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.adsl.beotel.net.



+8 Profil

icon Re: Perzistencija na fajl09.10.2007. u 21:05 - pre 201 meseci
Mislila sam na nesto ovako:
Code:

public boolean save() {
        boolean saved = false;
        //load existing elements
        Vector<Fax> list = loadAll();
        //add current object to vector
        list.add(this);
        try {
            //serialize vector
            ObjectOutputStream faxOos = new ObjectOutputStream(
                    new FileOutputStream("D:/tmp/faxDb.tmp", false));
            faxOos.writeObject(list);
            faxOos.close();
            saved = true;
        } catch (Exception e) {
            e.printStackTrace();
            saved = false;
        }
        return saved;
    }

u loadAll onda direktno iscitas ceo vektor, umesto da u petlji dodajes jedan po jedan element.


If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl10.10.2007. u 02:06 - pre 201 meseci
Mozda sam dosadan, ali...malo sam i nov u svemu ovome...a ovaj problem mi je vec oduzeo mnooogo vremena...:(
Ono sto si napisala list.add(this); Stalno mi izbacuje NullPointerException
A ako mi je loadAll():
Code:

public static Vector<Fax> loadAll(){
     Vector<Fax> allFax = new Vector<Fax>();
       try {
              ObjectInputStream faxOis = new ObjectInputStream(
                                              new FileInputStream("c:/tomcat/webapps/jSed/db/faxDb.tmp"));
           
           allFax = (Vector<Fax>) faxOis.readObject();
                             faxOis.close();
             } 
              catch (Exception e) {
            e.printStackTrace();
            allFax = null;
              }
                       return allFax;
    }

izbacuje mi stalno EOFException...
Hvala na pomoci!!!
Milan
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.cisco.com.



+8 Profil

icon Re: Perzistencija na fajl10.10.2007. u 11:17 - pre 201 meseci
NullPointerException dobijas zbog toga sto vratis null u slucaju da loadAll ne uspe.
Ja bih ti u tom slucaju preporucila da ne hvatas uopste taj exception, nego da ga propagiras. Tako bi ti mnogo jasnije bilo gde je doslo do problema.
Takodje, u loadAll ti preporucujem da proveris da li fajl uopste postoji, pre nego sto pokusas da ga iscitas.
Ako nemas fajl, ja bih vratila praznu listu, umesto null.

I samo strpljivo.. Bugovi su nezaobilazan deo developmenta, a njihovo resavanje neprocenjivo za ucenje i sticanje iskustva.
If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl10.10.2007. u 12:24 - pre 201 meseci
Neces mi verovati u cemu je na kraju bio problem...
Ja sam ovaj problem sa Vectorom pokusao odmah da resim, ali mi je stalno (radim u Eclipse 3.2) izbacivao EOFException i to kada u debugereru pogledam, kaze mi da ne moze da nadje source za ObjectInputStream.class, onda sam pokusavao na hiljadu drugih nacina, od kojih je jedan i onaj prvi sto sam poslao... Na kraju sam se skroz izgubio i zato sam i pitao za misljenja... SADA RADI!!!!:) Tvoja metoda save() i moja loadAll() su ok! Kao i uvek na kraju se ispostavi da je bilo nesto krajnje jednostavno...
Hvala ti puno na pomoci!!!
Pozdrav!
Milan
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.cisco.com.



+8 Profil

icon Re: Perzistencija na fajl10.10.2007. u 15:02 - pre 201 meseci
Citat:
miltes: ... SADA RADI!!!!:)

Yeeee :)
To sto ne moze da nadje source za ObjectInputStream znaci da si pokusao da odes predaleko u debuggingu.
Savetujem da ipak dodas neku proveru za postojanje fajla.
if(new File("...").exists()){...
Nece da skodi ;)

If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl11.10.2007. u 17:17 - pre 201 meseci
Citat:
sanchi: To sto ne moze da nadje source za ObjectInputStream znaci da si pokusao da odes predaleko u debuggingu.

Jel mi mozes objasniti sta to znaci? Hvala!
Prvi put koristim eclipse, do sada sam radio u jDeveloperu... Desilo mi se sledece! Kada sam ubacio if (new File("...")exists), i probao da vididm da li radi i izbrisao fajl faxDb.tmp, radilo je ok, i onda odjednom, kada sam kreirao novi fajl, svi stari exceptioni se vratili...

java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at data.organizacionastruktura.Fax.loadAll(Fax.java:220)
at data.organizacionastruktura.Fax.save(Fax.java:197)
at Tests.FaxTest.testSave(FaxTest.java:34)
at Tests.FaxTest.main(FaxTest.java:85)
java.lang.NullPointerException
at data.organizacionastruktura.Fax.save(Fax.java:199)
at Tests.FaxTest.testSave(FaxTest.java:34)
at Tests.FaxTest.main(FaxTest.java:85)

a u debugeru mi stalno daje "Edit source lookup Path", zna li neko sta sam uradio, pre ovoga je sve radilo ok, kod nisam menjao, a sada taj isti kod izbacuje exceptione.... Koristim Eclipse 3.2 i jdk1.5.0_06... Znam da je resenje postaviti neki path, ali ne znam koji ni gde???
Hvala!
Milan
 
Odgovor na temu

sanchi
Sanja Jokic
Beograd

Član broj: 148256
Poruke: 104
*.cisco.com.



+8 Profil

icon Re: Perzistencija na fajl11.10.2007. u 18:23 - pre 201 meseci
Uhh..
Window -> Preferences -> Java -> Build Path -> Classpath Variables
U zavisnosti od toga koji jdk koristis trebalo bi da imas JRE_SRC varijablu podesenu da pokazuje na src.zip folder iz tvog jdka.
Kod mene je to setovanje read-only, i vec je bilo podeseno?!
Koji path si postavio na Window -> Preferences -> Java -> Installed JREs?

A da si otisao predaleko u debuggingu mislila sam da si hteo da debagujes javinu internu klasu. Pa ok, to je ponekad korisno, ali najcesce se nepotrebno zagubis. Bolje polako pogledaj da li tvoj kod radi kako si zamislio.

Ajde baci jos jednom taj tvoj konacni kod za loadAll, pa da vidimo sta je sad problem.





If people were meant to pop out of beds we would all sleep in toasters.
Google is your friend http://justfuckinggoogleit.com/
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl11.10.2007. u 19:48 - pre 201 meseci
Citat:
sanchi
Koji path si postavio na Window -> Preferences -> Java -> Installed JREs?
.

c:\Java\jdk1.5.0_06
A u Classpath varijablama mi je, kao i tebi podeseno, na src.zip, read only je, dakle: JDK_SRC(reserved)- C:\jdk1.5.0_o6\src.zip

Ne razumem, zato sto je radilo, i kada sam uradio ono sa fajlom, sada vise ne radi...:(
loadAll():
Code:

  public static Vector<Fax> loadAll(){
            Vector<Fax> allFax = new Vector<Fax>();
       try {
           
                      ObjectInputStream faxOis = new ObjectInputStream(
                    new FileInputStream("c:/tomcat/webapps/jSed/db/faxDb.tmp"));
              allFax = (Vector<Fax>) faxOis.readObject();
                       faxOis.close();
       
       }
       
       catch (Exception e) {
        e.printStackTrace();
        allFax = null;
        }
        return allFax;
    }

Mozda zato sto je fajl prazan, pa nema sta da iscita....
Milan
 
Odgovor na temu

miltes
Novi Sad

Član broj: 151901
Poruke: 13
*.ns.ac.yu.



Profil

icon Re: Perzistencija na fajl11.10.2007. u 21:49 - pre 201 meseci
:) RADI!
Stavio sam i if(new File(...).exsists... i sada je sve ok!
Uradio sam sledece... Iskomentarisao ceo try catch blok u loadAll() metodi, i pokrenuo applikaciju, posle toga sam uklonio /* i */ i aplikacija radi OK, i u eclipse i kada je pustim preko tomcat-a! Ako neko zna u cemu je problem bio, neka pise...
Sanchi Hvala ti puno na pomoci!
Pozdrav!
Milan
 
Odgovor na temu

[es] :: Java :: Perzistencija na fajl

[ Pregleda: 2675 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.