UTF-8字节为string

假设我刚刚使用BufferedInputStream将UTF-8编码文本文件的字节读入字节数组中。 我知道我可以使用下面的例程将字节转换为一个string,但是这样做比单纯遍历字节和转换每个字节更有效率/更智能吗?

 public String openFileToString(byte[] _bytes) { String file_string = ""; for(int i = 0; i < _bytes.length; i++) { file_string += (char)_bytes[i]; } return file_string; } 

看看String的构造函数

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

如果你感觉很懒,那么可以使用Apache Commons IO库将InputStream直接转换为string:

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

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

 byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46}; String value = new String(byteArray, "UTF-8"); 

要转换UTF-8数据,你不能假定字节和字符之间的1-1对应关系。 尝试这个:

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

(Bah。我看到我正在慢慢点击Post Your Answerbutton。)

要将整个文件作为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 } } } 

你可以使用String(byte[] bytes)构造函数。 详细信息请参阅此链接 。 编辑你也必须考虑你的plateform的默认字符集按照Java文档:

通过使用平台的默认字符集解码指定的字节数组构造一个新的string。 新string的长度是字符集的函数,因此可能不等于字节数组的长度。 当给定字节在默认字符集中无效时,此构造函数的行为是未指定的。 当需要对解码过程进行更多的控制时,应该使用CharsetDecoder类。

你可以使用在这个问题中描述的方法(尤其是因为你从一个InputStream开始): 读取/转换一个InputStream为一个string

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

string有一个构造函数,需要byte []和charsetname作为参数:)

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

这是一个简单的函数,它将以字节读取并创build一个string。 它假定你可能已经知道什么编码文件是在(和其他默认值)。

 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好得多,因为它们非常昂贵。

 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,而不是一个字节数组? 就像是:

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

然后从内部读取直到完成。

我用这种方式

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