Java ObjectInputStream

Java Objectinputstream



«Οι πληροφορίες που γράφονται μέσω του αντικειμένου ενός ObjectOutputStream προσπελάζονται κυρίως χρησιμοποιώντας την κλάση ObjectInputStream. Ο κύριος στόχος της κλάσης ObjectInputStream θα ήταν να ανακατασκευάσει τα βασικά δεδομένα και τις οντότητες που παράγονται χρησιμοποιώντας την κλάση ObjectOutputStream. Κάνοντας χρήση ενός SocketStream, το ObjectInputStream μπορεί επίσης να χρησιμοποιηθεί για τη μεταφορά αντικειμένων σε διαφορετικούς κεντρικούς υπολογιστές. Ως εκ τούτου, αποφασίσαμε να γράψουμε έναν χρήσιμο οδηγό για το Ubuntu 20.04 σύστημά μας για την απόρριψη του αντικειμένου της κλάσης objectinputstream για την ανάγνωση δεδομένων από τη ροή εισόδου του αρχείου. Ας ξεκινήσουμε με το άνοιγμα μιας κονσόλας.'

Παράδειγμα 01

Ξεκινώντας το πρώτο παράδειγμα του άρθρου μας, δημιουργούμε ένα νέο αρχείο java, το 'test.java'. Μετά από αυτό, δημιουργήσαμε επίσης ένα αρχείο κειμένου στον ίδιο φάκελο.







Για να διαβάσουμε αντικείμενα της ροής εισόδου σε ένα πρόγραμμα java, πρέπει να εισαγάγουμε τη ροή εξόδου. Έτσι, εισάγαμε τα πακέτα 'java.io.ObjectInputStream' και 'java.io.ObjectOutputStream' στην αρχή. Μαζί με αυτό, για να εισαγάγουμε τα δεδομένα σε ένα αρχείο, πρέπει να εισαγάγουμε τα 'java.io.FileInputStream' και 'java.io.FileInputStream'. Έχουμε δημιουργήσει μια κλάση 'Main' που κρατά μια ενιαία συνάρτηση main().



Η εκτέλεση της συνάρτησης ξεκινά από τη δήλωση μιας ακέραιας μεταβλητής «d». Για να αποφύγουμε την ξαφνική έξοδο του προγράμματος λόγω σφαλμάτων, προσθέσαμε τη δήλωση try-catch της java. Το μέρος 'δοκιμάστε' ξεκινά με την προετοιμασία ενός αντικειμένου ροής εξόδου αρχείου 'f' μέσω της κλάσης FileOutputStream. Έχουμε περάσει το όνομα αρχείου 'new.txt' σε αυτό το αντικείμενο 'f'. Δημιουργήσαμε μια ροή εξόδου αντικειμένου 'o' και περάσαμε το αντικείμενο αρχείου 'f' στην κλάση ObjectOutputStream για να κάνουμε ένα αρχείο ροή εξόδου.



Στην αμέσως επόμενη γραμμή, καλούμε τη συνάρτηση writeInt() της ροής εξόδου Java μέσω του αντικειμένου ροής εξόδου 'o' για να της περάσουμε μια ακέραια μεταβλητή 'd', δηλαδή για να την αποθηκεύσουμε σε ένα αρχείο. Στη γραμμή 12, δημιουργήσαμε τη ροή εισόδου αρχείου 'fs' χρησιμοποιώντας την κλάση FileInputStream της java μεταβιβάζοντάς της ένα αρχείο 'new.txt', δηλαδή, έχει ήδη δεδομένα σε αυτό. Αυτό το αντικείμενο ροής εισόδου αρχείου 'fs' έχει περάσει στο νέο αντικείμενο 'os' της κλάσης ObjectInputStream για να ενεργοποιηθεί η ανάγνωση από τη ροή αρχείου. Η συνάρτηση println() από το πακέτο 'System.out' της java έχει απενεργοποιηθεί για να καλέσει τη συνάρτηση readInt() μέσω του αντικειμένου ροής εισόδου αντικειμένου 'os' για να εμφανίσει τα δεδομένα από το αρχείο new.txt. Μετά από αυτό, κλείνουμε τη ροή εξόδου και τη ροή εισόδου χρησιμοποιώντας τα αντίστοιχα αντικείμενά τους 'o' και 'os' χρησιμοποιώντας τη λειτουργία 'close' του χειρισμού αρχείων στη java. Αυτό είναι ένα απαραίτητο βήμα για να κλείσετε τις ροές έτσι ώστε κανένας άλλος χρήστης να μην μπορεί να εισάγει ή να εξάγει δεδομένα από ένα αρχείο. Μέσα στη δήλωση catch(), χρησιμοποιούσαμε τη συνάρτηση getStackTrace() για να λάβουμε ένα σφάλμα και να το εμφανίσουμε στην οθόνη μέσω της μεταβλητής Εξαίρεσης 'e'. Αυτό το πρόγραμμα είναι έτοιμο για εκτέλεση στο κέλυφος.





Μόλις είχαμε αποθηκεύσει το αρχείο κώδικα java πριν από την εκτέλεσή του και χρησιμοποιήσαμε την εντολή λέξης-κλειδιού java για να εκτελέσουμε το αρχείο 'test.java'. Δεν επιστρέφει τίποτα σε αντάλλαγμα. Επίσης, η εμφάνιση των δεδομένων ενός αρχείου κειμένου 'new.txt' στο κέλυφος χρησιμοποιώντας την εντολή 'cat' εμφανίστηκε μια τιμή σκουπιδιών. Αυτό συμβαίνει επειδή, τις περισσότερες φορές, ο εκτελεστής java δεν μπορεί να διαβάσει την ακέραια τιμή από το αρχείο. Αλλά πιθανότατα, θα εμφανίσει την ακριβή ακέραια τιμή.



Κατά τον έλεγχο του αρχείου new.txt ανοίγοντάς το με μη αυτόματο τρόπο, είδαμε ότι μια μορφή Unicode της τιμής έχει εμφανιστεί στο αρχείο.

Εάν δεν μπορείτε να εμφανίσετε την ακέραια τιμή από τη ροή του αρχείου, μπορείτε να χρησιμοποιήσετε τη συνάρτηση writeObject() στο πρόγραμμα java αντί για τη συνάρτηση writeInt() για να γράψετε την τιμή 'd' στη ροή αρχείου μέσω του αντικειμένου 'o' όπως εμφανίζεται. Μαζί με αυτό, πρέπει να απενεργοποιήσετε τη συνάρτηση 'readObject()' αντί της συνάρτησης readInt() για να εμφανίσετε τα δεδομένα από τη ροή εισόδου του αρχείου.

Η ενημέρωση αυτού του κώδικα θα εμφανίσει την ακέραια τιμή κατά την εκτέλεση.

Παράδειγμα 02

Ας έχουμε μια άλλη τιμή προγραμματισμού java για την απόρριψη της ροής εισόδου αντικειμένου για την τιμή τύπου συμβολοσειράς. Έτσι, έχουμε ξεκινήσει αυτό το παράδειγμα κώδικα με την εισαγωγή των ίδιων κλάσεων java FileInputStream, FileOutputStream, ObjectInputStream και ObjectOutputStream από το πακέτο «io» της βιβλιοθήκης java. Η κλάση Main έχει τη συνάρτηση main() για να ξεκινήσει την εκτέλεση αυτού του κώδικα. Μια μεταβλητή συμβολοσειράς 'd2' αρχικοποιείται με μια μεγάλη τιμή συμβολοσειράς.

Η ίδια δήλωση try-catch έχει απορριφθεί για να αποφευχθεί το σφάλμα και για ομαλή εκτέλεση αυτού του κώδικα java. Το αντικείμενο 'f' για τη ροή εξόδου αρχείου έχει δημιουργηθεί μέσω της κλάσης FileOutputStream λαμβάνοντας ως όρισμα το 'new.txt'. Το αντικείμενο ροής εξόδου αρχείου 'f' έχει περάσει στο αντικείμενο ροής εξόδου 'o' που έχει δημιουργηθεί με τη χρήση της κλάσης ObjectOutputStream. Τώρα, η ροή εξόδου 'o' καλούσε τη συνάρτηση writeObject() περνώντας της μια μεταβλητή συμβολοσειράς 'd' που θα γραφτεί στο αρχείο 'new.txt'.

Στη συνέχεια, δημιούργησε μια ροή εισόδου αρχείου 'fs' χρησιμοποιώντας την κλάση FileInputStream μεταβιβάζοντάς της ένα όνομα αρχείου 'new.txt', δηλαδή για να διαβάσετε τα δεδομένα από αυτήν. Τώρα, το αντικείμενο κλάσης ObjectInputStream 'os' θα χρησιμοποιούσε το αντικείμενο ροής εισόδου αρχείου 'fs' για να διαβάσει τα δεδομένα χρησιμοποιώντας τη συνάρτηση readObject() της java στη δήλωση εκτέλεσης 'println' της κλάσης 'System.out'. Στη συνέχεια, τείνουμε να κλείνουμε τις ροές εισόδου και εξόδου καλώντας τη συνάρτηση 'close' και η δήλωση catch χρησιμοποιείται για να ληφθούν τυχόν εξαιρέσεις που συνέβησαν στο μέρος δοκιμής και να αποφευχθεί το ξαφνικό κλείσιμο αυτής της εκτέλεσης του προγράμματος.

Η εκτέλεση αυτού του αρχείου κώδικα java και του αρχείου κειμένου εμφάνιζε την τιμή συμβολοσειράς στην κονσόλα.

συμπέρασμα

Η χρήση της κλάσης ObjectInputStream είναι η μόνη διαθέσιμη μέθοδος για την ανάγνωση ουσιών που χρησιμοποιούν το πρωτόκολλο Serializable ή Externalizable. Συνοψίζοντας, έχουμε συμπεριλάβει όλες τις απαραίτητες λεπτομέρειες για τη χρήση της κλάσης objectinputstream της java για την ανάγνωση δεδομένων από τη ροή εισόδου αντικειμένου αρχείου. Για αυτό, έχουμε ρίξει δύο διαφορετικά παραδείγματα κώδικα java εδώ. Το πρώτο παράδειγμα χρησιμοποιεί την τιμή της μεταβλητής εισόδου τύπου ακέραιου, ενώ η δεύτερη απεικόνιση απομάκρυνε την τιμή της μεταβλητής συμβολοσειράς, δηλαδή την ανάγνωση από τη ροή του αρχείου εισόδου.