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


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



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

```

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


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


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

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



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


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



```
while (reader.available() < 4) checkIfShutdown();
reader.readInt();

```
 

Μπορείτε να χρησιμοποιήσετε `InputStream.available()`για να πάρετε μια εκτίμηση της ποσότητας των bytes που μπορεί να διαβαστεί. Παραθέτοντας [το Javadoc](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/io/InputStream.html#available()) :



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


Με άλλα λόγια, αν `available()`επιστρέψει `n`, ξέρετε ότι μπορείτε να καλέσετε με ασφάλεια `read(n)`χωρίς να εμποδίζει. Σημειώστε ότι, όπως αναφέρει Javadoc, η τιμή που επιστρέφεται είναι μια εκτίμηση. Για παράδειγμα, [InflaterInputStream.available ()](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/zip/InflaterInputStream.html#available()) θα επιστρέφει πάντα 1 εάν EOF δεν έχει επιτευχθεί. Ελέγξτε την τεκμηρίωση της `InputStream`υποκατηγορίας που θα χρησιμοποιήσετε για να διασφαλιστεί ότι ανταποκρίνεται στις ανάγκες σας.

 

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

 