UTF-8 байт [] в строку - PullRequest
       30

UTF-8 байт [] в строку

235 голосов
/ 15 декабря 2011

Давайте предположим, что я только что использовал BufferedInputStream для чтения байтов кодированного текстового файла UTF-8 в байтовый массив. Я знаю, что могу использовать следующую процедуру для преобразования байтов в строку, но есть ли более эффективный / более умный способ сделать это, чем просто перебирать байты и конвертировать каждый из них?

public String openFileToString(byte[] _bytes)
{
    String file_string = "";

    for(int i = 0; i < _bytes.length; i++)
    {
        file_string += (char)_bytes[i];
    }

    return file_string;    
}

Ответы [ 11 ]

482 голосов
/ 15 декабря 2011

Посмотрите на конструктор для String

String str = new String(bytes, StandardCharsets.UTF_8);

И если вам лень, вы можете использовать библиотеку Apache Commons IO для преобразования InputStreamна строку напрямую:

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
39 голосов
/ 15 декабря 2011

Класс Java String имеет встроенный конструктор для преобразования байтового массива в строку.

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46};

String value = new String(byteArray, "UTF-8");
9 голосов
/ 15 декабря 2011

Для преобразования данных utf-8 вы не можете предполагать соответствие 1-1 между байтами и символами.Попробуйте это:

String file_string = new String(bytes, "UTF-8");

(Бах. Я вижу, что я слишком медленно нажимаю кнопку «Опубликовать свой ответ».)

Чтобы прочитать весь файл как строку, сделайте что-то вродеэто:

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
        }
    }
}
4 голосов
/ 15 декабря 2011

Для этого вы можете использовать конструктор String(byte[] bytes).Смотрите эту ссылку для деталей. РЕДАКТИРОВАТЬ Вы также должны учитывать кодировку по умолчанию вашей пластинчатой ​​формы согласно документу java:

Создает новую строку путем декодирования указанного массива байтов с использованием кодировки по умолчанию платформы.Длина новой строки является функцией набора символов и, следовательно, не может быть равна длине байтового массива.Поведение этого конструктора, когда указанные байты недопустимы в кодировке по умолчанию, не определено.Класс CharsetDecoder следует использовать, когда требуется больший контроль над процессом декодирования.

2 голосов
/ 16 января 2014

Вот упрощенная функция, которая читает байты и создает строку.Предполагается, что вы, наверное, уже знаете, в какой кодировке находится файл (и по умолчанию).

2 голосов
/ 15 декабря 2011

Вы можете использовать методы, описанные в этом вопросе (особенно если вы начинаете с InputStream): Чтение / преобразование InputStream в строку

В частности, если вы не хотите полагаться на внешние библиотеки, вы можете попробовать этот ответ , который читает InputStream через InputStreamReader в char[] буфер и добавляет его в StringBuilder.

2 голосов
/ 15 декабря 2011

Зная, что вы имеете дело с байтовым массивом UTF-8, вы определенно захотите использовать конструктор String, который принимает имя кодировки .В противном случае вы можете оставить себя открытыми для некоторых уязвимостей безопасности, связанных с кодировкой кодировки.Обратите внимание, что он выбрасывает UnsupportedEncodingException, с которым вам придется справиться.Как то так:

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 голос
/ 15 декабря 2011

String имеет конструктор, который принимает byte [] и charsetname в качестве параметров:)

0 голосов
/ 17 апреля 2017

Я так использую

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

0 голосов
/ 15 декабря 2011

Почему бы не получить то, что вы ищете с самого начала, и прочитать строку из файла вместо массива байтов?Что-то вроде:

BufferedReader in = new BufferedReader(new InputStreamReader( new FileInputStream( "foo.txt"), Charset.forName( "UTF-8"));

, затем прочитайте LineIn, пока все не будет сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...