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;
}
670115 次浏览
你可以为此使用String(byte[] bytes)构造函数。详见链接你还必须考虑你的平台的默认字符集,根据java文档:

通过解码指定的字节数组来构造一个新的String 平台的默认字符集。新字符串的长度是a 函数的字符集,因此可能不等于长度 字节数组。当给定字节时,此构造函数的行为 在未指定的默认字符集中无效。的 类时,应该使用CharsetDecoder类

.解码过程

这也涉及到迭代,但这比连接字符串好得多,因为它们非常非常昂贵。

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

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

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

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


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

查看字符串的构造函数

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

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

String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
要转换utf-8数据,不能假设字节和字符之间是1-1对应关系。 试试这个:< / p >
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
}
}
}

知道你在处理一个UTF-8字节数组,你肯定想要使用接受字符集名称的字符串构造函数。否则,您可能会面临一些基于字符集编码的安全漏洞。注意,它抛出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;
}

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

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

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

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

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

下面是一个简化的函数,它将读取字节并创建字符串。它假定您可能已经知道文件的编码(否则为默认值)。

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

我用这种方法

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