Байт UTF-8 [] для строки

Предположим, что я только что использовал 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;    
}

Ответ 1

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

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

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

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);

Ответ 2

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

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

String value = new String(byteArray, "UTF-8");

Ответ 3

Чтобы преобразовать данные 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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

У String есть конструктор, который принимает байты [] и charsetname как параметры:)

Ответ 8

Зная, что вы имеете дело с массивом байтов 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;
}

Ответ 9

Это также включает повторение, но это намного лучше, чем конкатенация строк, поскольку они очень дорогостоящие.

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

Ответ 10

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

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

а затем readLine от него до тех пор, пока он не будет выполнен.

Ответ 11

Я использую этот способ

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