Προς το περιεχόμενο

Java I/O: Random Access in text files


SV8DTP

Προτεινόμενες αναρτήσεις

Δημοσ.

Είναι δυνατόν να έχω random προσπέλαση (π.χ. με seek) σε ένα αρχείο κειμένου (το οποίο φυσικά γνωρίζω την δομή π.χ. space delimited fixed length records) μέσω από Java applet χωρίς να υπάρχει κάποιος αντίστοιχος server.

 

Το πρόβλημά μου είναι ότι έχω ένα αρχείο κειμένου όπως παραπάνω (αποθηκευμένο σε έναν web server) το οποίο περιέχει αρκετές εκατοντάδες εγγραφές από μία βάση δεδομένων. Θέλω λοιπόν να κάνω αναζήτηση βάση ενός από τα πεδία του (συγκεκριμένα το πρώτο) όμως είναι αρκετά (άνω των 500Κ) μεγάλο για να για το διαβάζω σειριακά μέσω του BufferedReader.

 

Ευχαριστώ.

Δημοσ.

Αυτό το είχα υπόψην μου κι εγώ. Αλλά νομίζω ότι το συγκεκριμένο δεν δουλεύει με αρχεία το οποία γνωρίζεις μόνο το URL. Νομίζω ότι δουλεύει μόνο με αρχεία που βρίσκονται τοπικά (το string που δέχεται στο όνομα αρχείου πρέπει να περιλάμβανει pathname και είναι machine-dependent). Πες μου εάν κάνω λάθος.

 

Σε ευχαριστώ για την απάντηση, έτσι κι αλλιώς.

Δημοσ.

Οσο αναφορα την αναγνωση του αρχειου που σερβιρεται απο τον Web Server αυτο που εχεις να κανεις ειναι να χρησιμοποιησεις ενα

ενα URL object οπου θα ειναι η διευθυνση που σερβιρει το αρχειο και στην συνεχεια ανοιγεις καποιο stream χρησιμοποιοντας την μεθοδο (openStream) (διαβασε το API) , οπως ο παρακατω κωδικας!

 

Αντιστοιχα μπορεις να χρησιμοποιησεις και ενα URLConnection Object αν θες να κανεις και αλλα πραγματα πχ να γραψεις κτλ κτλ. Απο το URLConnection object παλι θα παρεις το stream ktl ktl

>
URL yourURL = new URL("http://www.mysite.gr/myfiles/myFile.txt");
FileReader fr = new FileReader(new InputStreamReader(yourURL.openStream()));

 

μπορεις να δεις περιεκτικα ολες τις πληροφοριες ΠΑΛΙ στο JavaTutorial

http://java.sun.com/docs/books/tutorial/networking/urls/index.html

 

 

ΠΡΟΣΟΧΗ..ΟΛΑ ΑΥΤΑ ΜΕΣΑ ΣΤΟΝ ΚΩΔΙΚΑ ΤΟΥ APPLET ΘΑ ΛΕΙΤΟΥΡΓΗΣΟΥΝ ΑΝ ΚΑΙ ΜΟΝΟ ΑΝ ΤΟ ΑΡΧΕΙΟ ΣΕΡΒΙΡΕΤΑΙ ΑΠΟ ΤΟΝ ΙΔΙΟ WEB SERVER ΠΟΥ ΕΧΕΙ ΕΡΘΕΙ ΚΑΙ ΤΟ APPLET.ΣΕ ΟΠΟΙΑΔΗΠΟΤΕ ΑΛΛΗ ΠΕΡΙΠΤΩΣΗ ΔΕΝ ΘΑ ΜΠΟΡΕΣΕΙς ΝΑ ΚΑΝΕΙς ΤΙΠΟΤΑ..ΕΚΤΟΣ ΤΗΣ ΜΟΝΑΔΙΚΗς ΛΥΣΗΣ ΠΟΥ ΟΝΟΜΑΖΕΤΑΙ SINGED APPLET!

 

 

Για πιο πολλα...τα λεμε κατω ;)

Δημοσ.

Δεν είμαι απολυτώς σίγουρος (γιατί δεν το έχω ψάξει αρκετά εκτεταμένα) αλλά νομίζω ότι το FileReader δεν έχει την δυνατότητα random access δηλ. να πηγαίνω πότε μπρος και πότε πίσω στο αρχείο .txt μέχρι να βρώ την εγγραφή που θέλω (κάτι σαν binary search - το αρχείο είναι ταξινομημένο κάτα αύξουσα σειρά). Θα τα ψάξω και θα επανέλθω αλλά το βλέπω χλωμό να δουλέψει αυτό. Όσο για τον Web server - ναί είναι αυτός που τρέχει το applet.

Δημοσ.

την δυνατοτηα του random στην δινει ..το ιδιο το RandomAccessFile. και οχι καποιο stream.απλα το παραδειγμα μου πανω ηταν γενικο!

 

οποτε φανταζομαι οτι θα πρεπει να κανεις το εξης! Διαβασε..το αρχειο με καποιον reader , της αρεσκειας σου και στην συνεχεια φιαξε ενα αρχειο τοπικα στην μνημη για να μπορεις να το επεξεργαζεσαι σαν RandomAccessFile. γιατι δυστηχως απ'οτι βλεπω δεν μπορεις αμεσα να το κανεις αυτο.Αυτο εχει και ενα προβλημα το ποσο μεγαλο ειναι το αρχειο και ποσο θα σου παρει να κατεβει στην δικη σου μνημη.Ελπιζω να μην ειναι τεραστιο!

 

ο constructor του randomΑccessFile θελει File Object.

 

Δεν ξερω αν υπαρχει καποιο workwaround σε αυτο το παραξενο...μπορει και ναι αν ψαξεις αλλιως μπορεις να υλοποιησεις αυτο που περιεργραψα παραπανω!

Δημοσ.

Αυτό είναι το θέμα όλης της υπόθεσης δηλ. να μην καταβάσω όλο το αρχείο διότι μπορεί να είναι αρκετές εκατοντάδες KB. Το υποψιαζόμουνα ότι δεν ήταν δυνατό να έχεις random προσπέλαση σε ένα stream και ότι μέσω URL μόνο με stream μπορείς να πάρεις δεδομένα. Υπάρχουν κι άλλες λύσεις π.χ. να σπάσεις το μεγάλο αρχείο σε πολλά μικρότερα έτσι ώτσε να μειώσεις το download time αλλά τότε δεν κάνω αυτό που ήθελα (binary search σε εγγραφές αρχείου κειμένου). Νομίζω ότι εάν συμφωνείς κι εσύ το θέμα πρέπει να κλείσει. Απλώς ΔΕΝ ΓΙΝΕΤΑΙ. Συμφωνείς;;;;

Δημοσ.

χε ολα γινοντε, ειδικα στον προγραμματισμο! απλα πρεπει να βρεις αλλο τροπο! πως λεει η Πανια? Παρτο αλλιως?

 

Η λυση στο προβλημα σου θα ερθει μεσα απο καποιο server side προγραμμα ..θες CGI?>ASP? JSP? PHP? το οποιο θα κανει τα read/write στο αρχειο .δηλαδη αυτο που θες να κανεις..και εσυ απλα με καποιο τροπο πρεπει να επικοινωνεις μαζι του! Πολυ απλο client-server!

 

Αν σκεφτεις αυτο δεν ειναι προβλημα της Java..αλλα ειναι γενικοτερο χαρακτηριστικο. Δεν μπορω να σκεφτωβ αλλη γλωσσα που να μπορεις να το κανεις αυτο...υπο την μορφη ετοιμης λυσης κτλ κτλ!

 

Καλη συνεχεια!

Δημοσ.

Όσα υπόθηκαν μέχρι τώρα, προϋοποθέτουν ότι δεν υπάρχει κάποιο αντίστοιχο server-side πρόγραμμα για την υποστήριξη. Εάν είχα αυτή τη δυνατότητα θα δούλευα κατευθείαν με DBMS calls και δεν θα ανέτρεχα στην λύση του text file.

 

Συμφωνώ ότι με κάποιου είδους text stream δεν λύνεται το πρόβλημα. Εξάλου, τώρα που το σκέφτομαι, τί είδους stream (ροή) είναι αυτό που γυρνάει πίσω!!!!!

 

Το εάν αυτό είναι περιορισμός της Java ή όχι δεν μπορώ να σε ακολουθήσω στην άποψή σου. Δεν θα ήθελα να μπούμε τώρα σε αυτό το θέμα, από τη στιγμή κι όλας που το όνομά σου δηλώνει θερμό υποστηρικτή της Java. Γνωρίζω τουλάχιστο άλλη μία Java-like γλώσσα που πιστεύω (όχι 100%) ότι σου επιτρέπει τέτοιου είδους κόλπα. Πρόκειται για την Tcl η οποία δυστυχώς δεν είναι τόσο διαδεδομένη με αποτέλεσμα το plugin της να μην είναι standard στους Browsers και δεν θα ήθελα υποχρεώνω όλους τους αναγνώστες των ιστοσελίδων μου να εγκαθιστούν το plugin (γύρω στο 1ΜΒ) για να έχουν πρόσβαση στις εγγραφές της βάσεις δεδομένων που έτσι κι αλλιώς το πιθανότερο είναι ότι δεν πρόκειται να το χρησιμοποιήσουν πουθενά αλλού.

Δημοσ.

μαλιστα..ε αφου εχεις βρει λοιπον το εργαλειο..τοτε χρησιμοποιησε το!

δεν βρισκω το λογο να 'μονομαχησουμε' για την ευκολια της Java! ειναι μακρα χιλιοειπομενη και καμια μου...αποψη δεν προκειται να την κανει καλυτερη η λιγοτερη καλυτερη στα ματια του καθενα!

 

Καλη συνεχεια!

Δημοσ.

Τα είπαμε αυτά φίλε Javaνίδη.

 

Όπως και να έχει το πράγμα χίλια ευχαριστώ για τα παραπάνω postings τα οποία ήταν εξαιρετικά καθοδηγητικά για πιθανές προσεγγίσεις του προβλήματος, άσχετα εάν τελικά δεν μπορώ να λύσω το πρόβλημά μου. (Ίσως γι' αυτό τελικά χρησιμοποιούνται οι εναλλακτικές λύσεις που προτείναμε through-out the web.)

 

Σ' ευχαριστώ για την βοήθεια σου στην κατανόηση επιμέρους λεπτομερειών της γλώσσας η οποία ομολογώ ότι είναι νέα για μένα (μόλις 7 ημερών) και εκτός των άλλων, ίσως δεν έχω το δικαίωμα να κρίνω ακόμη!!

 

73, de SV8DTP

Δημοσ.

Συγνώμη φίλε Javaνίδη :oops: , κατά 99% ούτε με την Tcl λύνεται το πρόβλημα. Μάλλον είναι χαρακτηριστικό του πρωτοκόλου. Ίσως με τα sockets να γίνει κάτι αλλά δεν ξέρω από GET & POST. Θα τα ψάξω και θα επανέλθω.

Δημοσ.

οφειλω να πω οτι δεν εχω ιδεα απο TCL οποτε γενικα..υπεθεσα οτι ειχες -εχειςδικιο.παρολα αυτα ειχα μια αμφιβολια γενικα για το πως μπορει και το υλοποιει αυτο το πραγματα..μιας και μιλαμε για μια διεργασια η οποια ειναι ιδιατερα συνθετη! αν αναλογιστει κανεις!

 

δεν ξερω αν συνεχιζεις να σκεφτεσαι την λυση του server -side προγραμματος! γενικα δεν ειναι τιποτα να υλοποιησεις GET/POST ..υπαρχουν σχεδον ετοιμα τα παντα.(java.net πακετο httpURLConnection κτλ κτλ).εκτος αν θελεις να πειραματιστεις (ετσι για την πλακα) και να δημιουργησεις ενα Mini-implementation του ΗΤΤP πανω απο τα sockets.

 

τα παραπανω αφορουν για το πως θα μιλησεις με το server side εργαλειο σου!

το οποιο μπορει να ειναι της αρεσκειας σου..ακομα και cgi (μπλιαχ) η οτι δηποτε υποστηριζει ο server μιας και φανταζομαι οτι δυσκολα θα αποκτησει δυνατοτηα JSP αν δεν ειδη εχει!

Δημοσ.

Τελικά μάλλον (;;;;) δεν γίνεται τίποτα εάν δεν υπάρχει κάτι από τη άλλη πλευρά (server) για την εξυπηρέτηση των queries. Κάτι που στην δική μου περίπτωση δεν μπορεί να γίνει (πρόκειται για έναν απλό WEB-SERVER). Δεν μπόρεσα να βρω αρκετές πληροφορίες για τα GET&POST αλλά είμαι σχεδόν σίγουρος ότι δεν μπορεί να υλοποιηθεί το Random Access μέσω αυτών.

 

Εάν δεν έχεις κάτι να προσθέσεις Javaνίδη (ή κάποιος άλλος) θα ζητήσω από τον Διόνυσο να κλείσει το Θέμα.

 

Ευχαριστώ για την μέχρι τώρα καθοδήγησή σου και τις ιδέες σου. :)

Δημοσ.

για να λες απλος..κατι θα ξερεις παρολα αυτα ..τι μηχανημα ειναι..Java μπορει να τρεξει γενικα! στο κατω κατω φιαξε εναν standalone server να ακουει σε δικη του πορτα..και με ενα προτοκολο της πλακας..και προσπαθησε να επικοινωνησεις μαζι του..ουτε και αυτο γινεται?

 

αν οχι..τοτε..μαλλον δεν βρισκουμε λυση!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...