UTF-8 byte []到String

ske*_*ryl 237 java utf-8

假设我刚刚使用a 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;    
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ols 486

查看String的构造函数

String str = new String(bytes, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

如果你感到懒惰,你可以使用Apache Commons IO库直接将InputStream转换为String:

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • 或者Guava的[Charsets.UTF_8](https://code.google.com/p/guava-libraries/wiki/StringsExplained#Charsets)如果你的JDK早于1.7 (13认同)
  • 如果你的Android API低于19,请使用Guava的Charsets.UTF_8 (6认同)
  • IOUtils.toString(inputStream,StandardCharsets.UTF_8)现已弃用. (2认同)

Kas*_*han 40

Java String类有一个内置构造函数,用于将字节数组转换为字符串.

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

String value = new String(byteArray, "UTF-8");
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 9

要转换utf-8数据,您不能假设字节和字符之间的对应关系为1-1.试试这个:

String file_string = new String(bytes, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

(呸.我看到我按"发布你的答案"按钮放慢了速度.)

要将整个文件作为String读取,请执行以下操作:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)