让我们假设我刚刚使用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;    
}

当前回答

知道您正在处理一个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;
}

其他回答

为什么不从一开始就得到你要找的东西,从文件中读取一个字符串,而不是一个字节数组呢?喜欢的东西:

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

然后从内读取line,直到完成。

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

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

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

String有一个构造函数,以字节[]和charsetname作为参数:)

你可以使用这个问题中描述的方法(特别是因为你从一个InputStream开始):读取/转换一个InputStream到一个String

特别是,如果你不想依赖于外部库,你可以尝试这个答案,它通过InputStreamReader将InputStream读入char[]缓冲区,并将其追加到StringBuilder中。

要转换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
        }
    }
}