Πώς μπορώ να διαβάσω/μετατρέψω ένα InputStream σε String στη Java;

Αν έχετε ένα αντικείμενο java.io.InputStream, πώς πρέπει να επεξεργαστείτε αυτό το αντικείμενο και να παράγετε ένα String;


Ας υποθέσουμε ότι έχω ένα InputStream που περιέχει δεδομένα κειμένου, και θέλω να το μετατρέψω σε String, ώστε για παράδειγμα να μπορώ να το γράψω σε ένα αρχείο καταγραφής.

Ποιος είναι ο ευκολότερος τρόπος για να πάρω το InputStream και να το μετατρέψω σε String;

public String convertStreamToString(InputStream is) {
    // ???
}
Λύση

Ένας ωραίος τρόπος για να το κάνετε αυτό είναι να χρησιμοποιήσετε το Apache commons IOUtils για να αντιγράψετε το InputStream σε ένα StringWriter... κάτι σαν

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

ή ακόμα και

// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding); 

Εναλλακτικά, θα μπορούσατε να χρησιμοποιήσετε το ByteArrayOutputStream αν δεν θέλετε να αναμειγνύετε τις ροές και τους συγγραφείς σας.

Σχόλια (15)

Το Apache Commons επιτρέπει:

String myString = IOUtils.toString(myInputStream, "UTF-8");

Φυσικά, θα μπορούσατε να επιλέξετε και άλλες κωδικοποιήσεις χαρακτήρων εκτός του UTF-8.

Δείτε επίσης: (τεκμηρίωση)

Σχόλια (9)

Λαμβάνοντας υπόψη το αρχείο θα πρέπει πρώτα να αποκτήσετε μια περίπτωση java.io.Reader. Αυτό μπορεί στη συνέχεια να διαβαστεί και να προστεθεί σε ένα StringBuilder (δεν χρειαζόμαστε το StringBuffer αν δεν έχουμε πρόσβαση σε αυτό σε πολλαπλά νήματα, και το StringBuilder είναι ταχύτερο). Το κόλπο εδώ είναι ότι δουλεύουμε σε μπλοκ, και ως εκ τούτου δεν χρειαζόμαστε άλλες ροές buffering. Το μέγεθος του μπλοκ παραμετροποιείται για βελτιστοποίηση της απόδοσης κατά τη διάρκεια εκτέλεσης.

public static String slurp(final InputStream is, final int bufferSize) {
    final char[] buffer = new char[bufferSize];
    final StringBuilder out = new StringBuilder();
    try (Reader in = new InputStreamReader(is, "UTF-8")) {
        for (;;) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0)
                break;
            out.append(buffer, 0, rsz);
        }
    }
    catch (UnsupportedEncodingException ex) {
        /* ... */
    }
    catch (IOException ex) {
        /* ... */
    }
    return out.toString();
}
Σχόλια (12)