Αν έχετε ένα αντικείμενο 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
αν δεν θέλετε να αναμειγνύετε τις ροές και τους συγγραφείς σας.
Το Apache Commons επιτρέπει:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Φυσικά, θα μπορούσατε να επιλέξετε και άλλες κωδικοποιήσεις χαρακτήρων εκτός του UTF-8.
Δείτε επίσης: (τεκμηρίωση)
Λαμβάνοντας υπόψη το αρχείο θα πρέπει πρώτα να αποκτήσετε μια περίπτωση 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();
}