wake-up-neo.net

UTF-8-Byte [] an String

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;    
}
227
skeryl

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);
474
Jason Nichols

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");
38
Kashif Khan

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
        }
    }
}
8
Ted Hopp

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.

4
GETah

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();
}
2
scottt

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.

2
Bruno

String hat einen Konstruktor, der Byte [] und den Zeichensatznamen als Parameter verwendet :)

1
soulcheck

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;
}
1
Asaph

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.

0
digitaljoel

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();    
}
0
bragboy

Ich benutze diesen Weg

String strIn = new String(_bytes, 0, numBytes);

0