Ανάγνωση n bytes atomically χωρίς μπλοκάρισμα

ψήφοι
0

Απλά μια ερώτηση σχετικά με το γιατί το νήμα μου κλειστό κάτω δεν λειτουργούσε. Κατέληξε να είναι λόγω του readLine()αποκλεισμού νήμα μου πριν θα μπορούσε να αναγνωριστεί η σημαία τερματισμού. Αυτό ήταν εύκολο να καθοριστεί από τον έλεγχο ready()πριν από την κλήση readLine().

Ωστόσο, είμαι τώρα χρησιμοποιούν ένα DataInputStreamγια να κάνετε τα εξής σε σειρά:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

Ξέρω ότι θα μπορούσαν να εφαρμόσουν τη δική μου buffering που θα ελέγχει το τρέξιμο σημαία αρχείο κατά τη φόρτωση μέχρι το buffer. Αλλά ξέρω ότι αυτό θα ήταν κουραστικό. Αντ 'αυτού, θα μπορούσα να αφήσει τα στοιχεία να είναι ρυθμισμένο στο πλαίσιο της InputStreamτάξης, και περιμένετε μέχρι να έχω μου nbytes διαβάσει, πριν από την εκτέλεση μη κλειδώματος διαβάσει - και ξέρω πόσο πολύ χρειάζεται να διαβάσει.

  • 4 bytes για τον πρώτο ακέραιο
  • 4 bytes για το δεύτερο ακέραιο y
  • και ybytes για τον zπίνακα byte.

Αντί να χρησιμοποιήσετε ready()για να ελέγξετε εάν υπάρχει μια γραμμή στο ρυθμιστικό, είναι κάποια ισοδύναμη εκεί ready(int bytesNeeded);

Δημοσιεύθηκε 14/02/2020 στις 00:00
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
0

Η available()μέθοδος επιστρέφει το ποσό των bytes στο InputStreams εσωτερική μνήμη.

Έτσι, μπορεί κανείς να κάνει κάτι σαν:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Απαντήθηκε 14/02/2020 στις 00:19
πηγή χρήστη

ψήφοι
0

Μπορείτε να χρησιμοποιήσετε InputStream.available()για να πάρετε μια εκτίμηση της ποσότητας των bytes που μπορεί να διαβαστεί. Παραθέτοντας το Javadoc :

Επιστρέφει μια εκτίμηση του αριθμού των bytes που μπορούν να διαβαστούν (ή υπερπήδηση πάνω) από αυτό το ρεύμα εισόδου χωρίς κλείδωμα, η οποία μπορεί να είναι 0, ή 0 όταν το άκρο του ρεύματος ανιχνεύεται. Η ανάγνωση μπορεί να είναι στο ίδιο νήμα ή άλλο νήμα. Μια ενιαία ανάγνωσης ή παραλείψτε αυτού πολλοί bytes δεν θα μπλοκάρει, αλλά μπορεί να διαβάσει ή να παραλείψετε λιγότερες bytes.

Με άλλα λόγια, αν available()επιστρέψει n, ξέρετε ότι μπορείτε να καλέσετε με ασφάλεια read(n)χωρίς να εμποδίζει. Σημειώστε ότι, όπως αναφέρει Javadoc, η τιμή που επιστρέφεται είναι μια εκτίμηση. Για παράδειγμα, InflaterInputStream.available () θα επιστρέφει πάντα 1 εάν EOF δεν έχει επιτευχθεί. Ελέγξτε την τεκμηρίωση της InputStreamυποκατηγορίας που θα χρησιμοποιήσετε για να διασφαλιστεί ότι ανταποκρίνεται στις ανάγκες σας.

Απαντήθηκε 14/02/2020 στις 00:20
πηγή χρήστη

ψήφοι
0

Θα έχετε την ευκαιρία να χρειαστεί να εφαρμόσουν τη δική σας ισοδύναμο BufferedInputStream. Είτε ως μοναδικός ιδιοκτήτης του ένα InputStreamκαι ένα σπείρωμα (ενδεχομένως δανειστεί από μια πισίνα) να εμποδίσει σε. Εναλλακτικά, εφαρμογή με NIO.

Απαντήθηκε 14/02/2020 στις 00:51
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more