PDA

Επιστροφή στο Forum : I/O objects in java



ring0
01-01-09, 20:33
καλησπερα και καλη χρονια,
στο παρακατω δημιουργω ενα .dbs file , το αρχειο εχει μεταβλητου μηκους records..
kai κανω serialization kai deserialization ...(εδω κολαω)....το προγραμμα εκτελειται χωρις compilation errors but στην εξοδο μου βγαζει ενα καρο μ***..ασχετα με αυτα που δινω...
επισης παρατηρω οτι παντα catch exception(στο μοναδικο try-catch ) τη στιγμη που τα δεδομενα που εισαγω ειναι σωστα...
δεν μπορω να βρω τι φταιει....:hmm:
οποια βοηθεια δεκτη....thanks....:oneup:
o code

import java.io.*;

class Console
{
String console_string()
throws IOException
{
//i am using a buffer
BufferedReader buffer=new BufferedReader(new InputStreamReader(System.in));
String str=null;
str=buffer.readLine();
return str;
}


//reading double value
double console_double()
throws IOException
{
return (Double.parseDouble(console_string()));
}
//reading an int value
int console_int()
throws IOException
{
return ((int)(console_double()));
}


}
//serialization:store objects in a file...
class Medicin implements Serializable
{
String name;
int stock;
int safe;
double cost;
// constructor
public Medicin (String n,int st,int sa,double c)
{
name=n;
stock=st;
safe=sa;
cost=c;

}

}

class database{
public static void main (String x[])
throws IOException
{
PrintStream out=System.out;
boolean criterion=true;
String name0;
int stock0,safe0;
double cost0;
Medicin object;
//input file
Console in=new Console();
out.print("full name of dbfile==>");
String f=in.console_string();
FileOutputStream datafile=new FileOutputStream(f);
ObjectOutputStream file=new ObjectOutputStream(datafile);


//input some records
while(criterion)
{
object=null;
out.print("name(stop for end)==>");
name0=in.console_string();
if(name0.equals("stop"))
criterion=false;
else
{
out.print("stock==>");
stock0=in.console_int();
out.print("safe==>");
safe0=in.console_int();
out.print("cost==>" );
cost0=in.console_double();
object=new Medicin(name0,stock0,safe0,cost0);
file.writeObject(object);
}

}

file.close();

//read data from the dbfile
FileInputStream readdata=new FileInputStream(f);
ObjectInputStream infile=new ObjectInputStream(readdata);
Medicin inobject;
out.println("you gave the following data");

do
{
inobject=null;
try
{


inobject=(Medicin)infile.readObject();
}
catch (Exception e){
out.println("the data you gave were wrong");
}
if (inobject==null) break;
out.println(inobject);
}
while(true);
infile.close();
}


}

Lucky Luke
02-01-09, 15:04
Το πρόγραμμά σου δεν έχει πρόβλημα. Στην έξοδο σου βγάζει αυτό που του λες να τυπώσει (δηλαδή όλο το αντικείμενο) και αυτό τυπώνει αυτά τα ακαταλαβίστικα σύμβολα γιατί έτσι το αντιλαμβάνεται στη μνήμη. Δεν ξέρω λεπτομέρεις να σου πω για αυτού του είδους την αναπαράσταση.

Για να τυπώσεις σωστά τα αποτελέσματα πρέπει να κάνεις στην κλάση του αντικειμένου που σειριακοποιείς (Medicin) override την μέθοδο toString() της κλάσης Object. Π.χ. γράψε κάτι σαν αυτο:

public String toString()
{
return name + ", " + stock + ", " + safe + ", " + cost;
}

και εκεί που πας να τυπώσεις τα αποτελέσματα αντικατέστησε το

out.println(inobject);
με

out.println(inobject.toString());

hammer21
02-01-09, 15:35
και εκεί που πας να τυπώσεις τα αποτελέσματα αντικατέστησε το

out.println(inobject);
με

out.println(inobject.toString());


Νομιζω δεν ειναι απαραιτητο αυτο.Η toString() καλειται αυτοματα στην java:hmm:

Lucky Luke
02-01-09, 15:42
Ναι, μάλλον έχεις δίκιο.
Απλά δεν ήμουν σίγουρος και επειδή το είχα ήδη δοκιμάσει έτσι και δούλευε βαριόμουν να φτιάξω κι άλλω dbs file για να το δοκιμάσω.:p

Πάντως με αυτόν τον τρόπο φαίνεται και πιο ξεκάθαρα τα "λάθος" που έχει κάνει ο billy dev. Στην ουσία αυτή η κλήση γίνεται απλά στη μία περίπτωση το βλέπουμε και στον κώδικα ενώ στην άλλη όχι.

ring0
02-01-09, 18:10
κανω override τη μεθοδο ....τωρα οκ εμφανιζονται ολα....
παρατηρω ομως οτι ενω δινω σωστα data παντα εδω

try
{
inobject=(Medicin)infile.readObject();
}
catch (Exception e){
out.println("the data you gave were wrong");
}

catches exception ...γιατι???υπαρχει και αλλο λαθος ??δεν θα επρεπε να γινεται αυτο...:hmm:

Lucky Luke
02-01-09, 18:16
Πετάει κάποιο EOF (end of file) Exception. Δεν είμαι σίγουρος αν λύνεται με κάποιο τρόπο, ίσως με κάποια συνθήκη που θα εξετάζει αν έχεις φτάσει στο τέλος. Πάντως δεν επηρεάζει την ορθότητα του προγράμματος.

Τώρα που ξαναείδα τον κώδικα για δοκίμασε το do-while loop να το κάνεις απλό while γιατί απ' ό,τι φαίνεται πρώτα πάει να εκτελεστεί κάποιο loop και μετά κάνεις τον έλεγχο

if (inobject==null) break;

Μάλλον αυτό φταίει.

ring0
02-01-09, 18:57
τωρα που το ξανασκεφτομαι παντα θα πεταει eof exception ..οταν φτανει στο τελος του αρχειου....το προβλημα μου ηταν οτι τυπωνε
out.println("the data you gave were wrong");
...το εβγαλα τελειως και τωρα ειμαι οκ....
θα μπορουσα να βγαλω εντελως και το try-catch ...:hmm:

hammer21
02-01-09, 19:16
θα μπορουσα να βγαλω εντελως και το try-catch ...

Οχι βεβαια.τοτε θα σου κρασαρει το προγραμμα.Βαλε catch και ας μην εχει σωμα.1000 φορες απο το να μην εχεις τιποτα.;)

ring0
02-01-09, 19:43
Οχι βεβαια.τοτε θα σου κρασαρει το προγραμμα.Βαλε catch και ας μην εχει σωμα.1000 φορες απο το να μην εχεις τιποτα.;)

δεν παιζει καθολου αν το βγαλω....δυσκολο το exception handling στη java .....:angryr:

dvm
02-01-09, 21:04
Δεν είναι καθόλου δύσκολο, να το συνηθίσεις πρέπει. Διάβασε την readObject και δες τους λόγους που σου πετάει exception. Δες ακόμα αν μπορείς να ελέγξεις αν όντως έφτασες στο τέλος του αρχείου με κάποιον άλλο τρόπο.

ΥΓ: Απ'ότι βλέπω η readObject μπορεί να πετάξει πολλά exceptions. Δες και την available() της ίδιας κλάσσης.

hammer21
02-01-09, 21:39
δεν παιζει καθολου αν το βγαλω....δυσκολο το exception handling στη java .....:angryr:

Χμμ,τεμπελια μου μυριζει στο να αναγνωρισεις ποιες εξαιρεσεις πεταει:p

Με μια προχειρη ματια...ClassCastException,EOFException,IOException

ring0
03-01-09, 01:58
Χμμ,τεμπελια μου μυριζει στο να αναγνωρισεις ποιες εξαιρεσεις πεταει:p

Με μια προχειρη ματια...ClassCastException,EOFException,IOException
οχι... απλα ασχολουμαι με java κανα 2 μηνες και δεν εχω εξοικιωθει ακομα....:)

dvm
03-01-09, 03:25
Πάντα να τσεκάρεις τα javadocs. Έχουν πολύτιμες πληροφορίες.

hammer21
03-01-09, 15:11
οχι... απλα ασχολουμαι με java κανα 2 μηνες και δεν εχω εξοικιωθει ακομα....:)

Οκ,τοτε:)
Να παιζεις με netbeans,θα σε βοηθησει σε κατι τετοιες περιπτωσεις.αν και καλο θα ηταν να ξερεις οτι μπορεις να τη βγαλεις καθαρη και χωρις αυτο

nikospara
07-01-09, 14:13
Καλή χρονιά σε όλους,

@billy το πρόβλημα είναι εννοιολογικό. Δεν ξέρεις εξαρχής πόσα Medicin (παρεπιπτόνως μήπως Medicine; ) είναι αποθηκευμένα στο αρχείο, οπότε το loop τελειώνει όταν βρείς EOF. Από τον τρόπο λειτουργίας του ObjectInputStream όμως δεν μπορείς να ξέρεις εκ των προτέρων πότε έχει EOF, παρά μόνον αν σου πετάξει java.io.EOFException.

Κατά συνέπεια θα προτείνα να εξειδικεύσεις το catch σε catch(EOFException e). Έτσι δείχνεις καθαρότερα την πρόθεση του κώδικά σου, οπότε αυτός γίνεται πιο ευανάγνωστος. Επίσης δε συνεχίζεις ανέμελα την εκτέλεση του προγράμματος λες και δεν έχει συμβεί τίποτα στην περίπτωση που συμβεί κάτι άλλο κακό (πχ corrupted file).

Εναλλακτικά, και αν δε σε πειράζει να φορτώσεις τη μνήμη σου, μπορείς να βάλεις όλα τα Medicin σε ένα Collection (java.util.List, Set, Map κοκ) και αποθήκευσε αυτό σε αρχείο.

ring0
07-01-09, 16:18
ευχαριστω πολυ nikospara...με βοηθας απιστευτα......:oneup::respekt:

@ ADSLgr.com All rights reserved.