Nehmen wir an, ich habe gerade eine BufferedInputStream
verwendet, 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 umzuwandeln, aber gibt es einen effizienteren/intelligenteren Weg, als nur die Bytes zu durchlaufen und jedes 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;
}
Betrachten Sie den Konstruktor für String
String str = new String(bytes, StandardCharsets.UTF_8);
Wenn Sie sich faul fühlen, können Sie die Bibliothek Apache Commons IO verwenden, um InputStream direkt in einen String zu konvertieren:
String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
Die Java-String-Klasse verfügt über einen integrierten Konstruktor zum Konvertieren von Byte-Arrays in String.
byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46};
String value = new String(byteArray, "UTF-8");
Um UTF-8-Daten zu konvertieren, können Sie nicht davon ausgehen, dass eine 1: 1-Korrespondenz zwischen Byte und Zeichen besteht.
String file_string = new String(bytes, "UTF-8");
(Bah. Ich sehe, ich bin zu langsam beim Drücken der Schaltfläche "Post Your Answer".)
Um eine gesamte Datei als String zu lesen, führen Sie Folgendes aus:
public String openFileToString(String fileName) throws IOException
{
InputStream is = new BufferedInputStream(new FileInputStream(fileName));
try {
InputStreamReader rdr = new InputStreamReader(is, "UTF-8");
StringBuilder contents = new StringBuilder();
char[] buff = new char[4096];
int len = rdr.read(buff);
while (len >= 0) {
contents.append(buff, 0, len);
}
return buff.toString();
} finally {
try {
is.close();
} catch (Exception e) {
// log error in closing the file
}
}
}
Sie können dafür den Konstruktor String(byte[] bytes)
verwenden. Weitere Informationen finden Sie in diesem link .EDIT Außerdem müssen Sie den Standardzeichensatz Ihres Plattenformulars gemäß dem Java-Dokument berücksichtigen:
Erstellt einen neuen String, indem das angegebene Byte-Array mit .__ decodiert wird. der Standardzeichensatz der Plattform. Die Länge des neuen Strings beträgt Funktion des Zeichensatzes und ist daher möglicherweise nicht gleich der Länge von das Bytearray. Das Verhalten dieses Konstruktors, wenn die angegebenen Bytes sind im Standardzeichensatz nicht gültig. Das Die CharsetDecoder-Klasse sollte verwendet werden, wenn mehr Kontrolle über die .__ vorhanden ist. Decodierungsprozess ist erforderlich.
Hier ist eine vereinfachte Funktion, die Bytes einliest und einen String erzeugt. Es wird davon ausgegangen, dass Sie wahrscheinlich bereits wissen, in welcher Kodierung die Datei enthalten ist (und ansonsten Standardeinstellungen).
static final int BUFF_SIZE = 2048;
static final String DEFAULT_ENCODING = "utf-8";
public static String readFileToString(String filePath, String encoding) throws IOException {
if (encoding == null || encoding.length() == 0)
encoding = DEFAULT_ENCODING;
StringBuffer content = new StringBuffer();
FileInputStream fis = new FileInputStream(new File(filePath));
byte[] buffer = new byte[BUFF_SIZE];
int bytesRead = 0;
while ((bytesRead = fis.read(buffer)) != -1)
content.append(new String(buffer, 0, bytesRead, encoding));
fis.close();
return content.toString();
}
Sie können die in dieser Frage beschriebenen Methoden verwenden (vor allem, weil Sie mit einem InputStream beginnen): InputStream in einen String lesen/konvertieren
Wenn Sie sich nicht auf externe Bibliotheken verlassen möchten, können Sie diese Antwort versuchen, die InputStream
über eine InputStreamReader
in einen char[]
-Puffer einliest und an eine StringBuilder
anfügt.
String hat einen Konstruktor, der Byte [] und den Zeichensatznamen als Parameter verwendet :)
Da Sie wissen, dass Sie ein UTF-8-Byte-Array verwenden, möchten Sie auf jeden Fall den String-Konstruktor verwenden, der einen Zeichensatznamen akzeptiert. Andernfalls können Sie sich einigen auf Charset-Verschlüsselung basierenden Sicherheitsanfälligkeiten öffnen. Beachten Sie, dass es UnsupportedEncodingException
gibt, mit dem Sie umgehen müssen. Etwas wie das:
public String openFileToString(String fileName) {
String file_string;
try {
file_string = new String(_bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
// this should never happen because "UTF-8" is hard-coded.
throw new IllegalStateException(e);
}
return file_string;
}
Warum bekommen Sie nicht das, wonach Sie suchen, und lesen Sie einen String aus der Datei anstelle eines Bytearrays? So etwas wie:
BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream( "foo.txt"), Charset.forName( "UTF-8"));
dann readLine von innen bis es fertig ist.
Dies beinhaltet auch das Iterieren, aber dies ist viel besser als das Verketten von Strings, da sie sehr teuer sind.
public String openFileToString(String fileName)
{
StringBuilder s = new StringBuilder(_bytes.length);
for(int i = 0; i < _bytes.length; i++)
{
s.append((char)_bytes[i]);
}
return s.toString();
}
Ich benutze diesen Weg
String strIn = new String(_bytes, 0, numBytes);