Nehmen wir an, ich habe gerade a verwendet BufferedInputStream
, um die Bytes einer UTF-8-codierten Textdatei in ein Byte-Array zu lesen. Ich weiß, dass ich die folgende Routine verwenden kann, um die Bytes in eine Zeichenfolge zu konvertieren. Gibt es jedoch eine effizientere / intelligentere Methode, als nur die Bytes zu durchlaufen und jedes einzelne zu konvertieren?
public String openFileToString(byte[] _bytes)
{
String file_string = "";
for(int i = 0; i < _bytes.length; i++)
{
file_string += (char)_bytes[i];
}
return file_string;
}
String fileString = new String(_bytes,"UTF-8");
?byte[]
Speichers und das Konvertieren übernew String(_bytes,"UTF-8")
(oder sogar durch Chunks mit+=
der Zeichenfolge) am effizientesten ist. Das Verketten von InputStreams und Readern funktioniert möglicherweise besser, insbesondere bei großen Dateien.Antworten:
Schauen Sie sich den Konstruktor für String an
Und wenn Sie sich faul fühlen, können Sie den InputStream mithilfe der Apache Commons IO- Bibliothek direkt in einen String konvertieren:
quelle
java.nio.charset.Charset.availableCharsets()
Karte alle Zeichensätze sehen, nicht nur die Zeichensätze in derStandardCharsets
. Und wenn Sie einen anderen Zeichensatz verwenden möchten und dennoch verhindern möchten, dass der String-KonstruktorUnsupportedEncodingException
java.nio.charset.Charset.forName()
Die Java String-Klasse verfügt über einen integrierten Konstruktor zum Konvertieren eines Byte-Arrays in einen String.
quelle
Um utf-8-Daten zu konvertieren, können Sie keine 1-1-Entsprechung zwischen Bytes und Zeichen annehmen. Versuche dies:
(Bah. Ich sehe, ich bin viel zu langsam, wenn ich auf die Schaltfläche "Antwort posten" drücke.)
Gehen Sie folgendermaßen vor, um eine gesamte Datei als Zeichenfolge zu lesen:
quelle
Sie können den
String(byte[] bytes)
Konstruktor dafür verwenden. Siehe diesen Link für Details. BEARBEITEN Sie müssen auch den Standardzeichensatz Ihrer Plattenform gemäß dem Java-Dokument berücksichtigen:quelle
Charset
Argument verwenden, um sicherzustellen, dass die Konvertierung korrekt ist.Sie können die in dieser Frage beschriebenen Methoden verwenden (insbesondere, da Sie mit einem InputStream beginnen): Lesen / Konvertieren eines InputStream in einen String
Insbesondere wenn Sie sich nicht auf externe Bibliotheken verlassen möchten, können Sie diese Antwort ausprobieren , bei der das
InputStream
Via über einInputStreamReader
in einenchar[]
Puffer gelesen und an ein angehängt wirdStringBuilder
.quelle
Wenn Sie wissen, dass es sich um ein UTF-8-Byte-Array handelt, sollten Sie auf jeden Fall den String-Konstruktor verwenden, der einen Zeichensatznamen akzeptiert . Andernfalls können Sie sich einigen Sicherheitslücken auf der Basis von Zeichensatzcodierung aussetzen. Beachten Sie, dass es wirft, mit
UnsupportedEncodingException
denen Sie umgehen müssen. Etwas wie das:quelle
Hier ist eine vereinfachte Funktion, die Bytes einliest und eine Zeichenfolge erstellt. Es wird davon ausgegangen, dass Sie wahrscheinlich bereits wissen, in welcher Codierung sich die Datei befindet (und ansonsten standardmäßig).
quelle
String hat einen Konstruktor, der Byte [] und Zeichensatznamen als Parameter verwendet :)
quelle
Dies beinhaltet auch das Iterieren, aber dies ist viel besser als das Verketten von Zeichenfolgen, da diese sehr, sehr kostspielig sind.
quelle
String str = new String(byte[])
wird gut tun.Warum nicht gleich von Anfang an das bekommen, wonach Sie suchen, und statt eines Arrays von Bytes einen String aus der Datei lesen? Etwas wie:
dann readLine von in bis es fertig ist.
quelle
Ich benutze diesen Weg
String strIn = new String(_bytes, 0, numBytes);
quelle