Wise_One Δημοσ. 11 Μαΐου 2009 Δημοσ. 11 Μαΐου 2009 Πολλή καλησπέρα σας. Η ερώτησή μου βασικά είναι: υπάρχει έτοιμος τρόπος (μέθοδος μάλλον) που ελέγχει πότε φτάνουμε στο τέλος αρχείου όταν το διαβάζουμε; Ρωτάω γιατί σε πρόοδο που γράψαμε σήμερα στη σχολή, έπρεπε να διαβάσουμε από αρχείο (μέχρι το τέλος), χρησιμοποιώντας την ObjectInputStream. Μας είπε ότι δε χρειάζεται να δουλέψουμε με άλλες τάξεις... Αυτό που κατάφερα να κάνω είναι να διαβάσω μόνο το πρώτο αντικείμενο του αρχείου. Σας δίνω και τον κώδικα μήπως θέλετε να συμπληρώσετε εκεί (παρακαλώ συγχωρήστε τυχόν αβλεψίες και χαζά λάθη, έγραφα στις 4 κι είχα μάθημα απ' τις 8) > import java.io.*; public class BinaryInputTest { public static void main(String[] args) throws IOException{ System.out.println("Reading numbers in myNumbers.dat" + "\nNumbers read from file:"); File outputFile = new File("myNumbers.dat"); ObjectInputStream input = new ObjectInputStream(new FileInputStream( outputFile)); try{ System.out.println(input.readInt()); } catch(FileNotFoundException fnfe){ System.out.println("Cannot find file myNumbers.dat"); } catch(IOException ioe){ System.out.println("Problems with input from file myNumbers.dat"); } System.out.println("No more numbers in the file..."); } }
vag_pRiMi Δημοσ. 12 Μαΐου 2009 Δημοσ. 12 Μαΐου 2009 Από το API προκύπτει ότι συνεχίζεις να διαβάζεις Objects και primitives αμέριμνος καλώντας την σχετική read[<Type>], μέχρι που κάποιο read θα πετάξει EOFException. HTH
Wise_One Δημοσ. 12 Μαΐου 2009 Μέλος Δημοσ. 12 Μαΐου 2009 To loop ας πούμε πώς θα το κάνω; Ατέρμων βρόχος μέχρι να ρίξει εξαίρεση; Δε μου φαίνεται και τόσο σωστό... Φαντάζομαι πως θα πρέπει με κάποιο τρόπο να ζητάω το επόμενο αντικείμενο που είναι γραμμένο... Έγραψα στον κώδικα readInt() γιατί μέσω προγράμματος εγγραφής σε αρχείο γράψαμε ακεραίους.
vag_pRiMi Δημοσ. 12 Μαΐου 2009 Δημοσ. 12 Μαΐου 2009 Δε μου φαίνεται και τόσο σωστό... Φαντάζομαι πως θα πρέπει με κάποιο τρόπο να ζητάω το επόμενο αντικείμενο που είναι γραμμένο... Έγραψα στον κώδικα readInt() γιατί μέσω προγράμματος εγγραφής σε αρχείο γράψαμε ακεραίους. Όταν διαβάζεις ένα file με serialized objects, δεν μπορείς να έχεις την απαίτηση να σε "βοηθήσει" ο reader της Java και να σου πει εκ των προτέρων τα ακριβή περιεχόμενα του αρχείου που διαβάζεις. Μπορεί να σου πει για Strings και primitive types αλλά για δικά σου object types, sky is the limit. Εσύ το άνοιξες και (θεωρητικά τουλάχιστον, ξέρεις) τι και πόσο διαβάζεις. Ναι, ζητάς και η Java σου φέρνει το επόμενο object με την readObject. Αλλά μέχρι εκεί. Εσύ μετά πρέπει να το κάνεις cast στο runtime type που ξέρεις ότι είναι. Μάλιστα αν ξέρεις ότι μέσα στο αρχείο σου έχεις (στη σειρά) δύο int, ένα String και τέλος άλλο ένα int, τότε το EOFException δεν θα το δεις ποτέ. Αυτό είναι για να σου σφυρίξει ότι κάτι άλλο από αυτό που νομίζεις υπάρχει στο αρχείο. Πάντως η λογική του "διαβάζω το αρχείο μέχρι να σκάσει exception" δεν είναι κάτι το περίεργο. Το ίδιο ισχύει και σε text files αλλά και σε άλλες γλώσσες. > Employee obj = null; int biou = -1; boolean done = false; int item = 1; while (!done) { try { if (item == 1) { biou = input.readInt(); item++; } else if (item == 2) { obj = (Employee)input.readObject(); item++; } } catch (EOFException eofe) { done = true; } } HTH
Wise_One Δημοσ. 12 Μαΐου 2009 Μέλος Δημοσ. 12 Μαΐου 2009 Έχεις δίκιο σ' αυτό που λες. Εγώ είχα στο μυαλό μου ότι θα πρέπει ν' αυξάνω ένα "μετρητή" που θα δείχνει στο επόμενο αντικείμενο του αρχείου ενώ οι μέθοδοι της Java διαβάζουν αυτόματα κάθε επόμενο αντικείμενο. Αυτό που δε θυμόμουν καθόλου, είναι ότι όταν φτάνει στο τέλος του αρχείου, ρίχνει -1. Επομένως έπρεπε να κάνω απλά έναν έλεγχο. Το έλυσα (τώρα βέβαια, έχασα το 10άρι) έτσι: > int temp; while((temp=input.readInt()) != -1){ System.out.println(temp); }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.