O processo de conversão de uma matriz de bytes em String é chamado de decodificação. Este processo requer um Charset. Porém, devemos usar charset para decodificação uma matriz de bytes.
Existem duas maneiras de converter array de bytes em String:
- Usando Construtor de classe String
- Usando Codificação UTF-8
Usando o construtor de classe String
A maneira mais simples de converter uma matriz de bytes em String, podemos usar o construtor da classe String com byte[] como argumento do construtor.
String str=new String(bytes);
Exemplo
O exemplo a seguir não usa nenhuma codificação de caracteres.
public class ByteArraytoStringExample { public static void main(String args[]) { try { byte[] bytes = 'hello world'.getBytes(); //creates a string from the byte array without specifying character encoding String s = new String(bytes); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } } }
Saída:
Usando codificação UTF-8
Lembre-se da codificação de caracteres ao converter a matriz de bytes em String. Como bytes são dados binários, enquanto String são dados de caracteres. É importante conhecer a codificação original do texto a partir do qual a matriz de bytes foi criada. Quando usamos uma codificação de caracteres diferente, não recuperamos a string original.
Suponha que tenhamos que ler a matriz de bytes de um arquivo que está codificado em ' ISO_8859_1 '. Não temos nenhuma codificação de caracteres ao converter a matriz de bytes em string. Convertemos a matriz de bytes em String usando o construtor da classe String, mas isso não fornece uma garantia de que obteremos o mesmo texto de volta. Isso ocorre porque o construtor da classe String usa a codificação padrão da plataforma.
Bytes contém 8 bits que podem ter até 256 valores distintos. Funciona para conjuntos de caracteres ASCII, onde apenas sete bits são usados. Se os conjuntos de caracteres tiverem mais de 256 valores, devemos especificar explicitamente a codificação que informa como codificar os caracteres em uma sequência de bytes.
Existem os seguintes conjuntos de caracteres suportados pela plataforma Java:
- Conjuntos de caracteres padrão.ISO_8859_1
- StandardCharsets.US_ASCII
- Conjuntos de caracteres padrão.UTF_16
- Conjuntos de caracteres padrão.UTF_16BE
- Conjuntos de caracteres padrão.UTF_16LE
Quando não nos lembramos da codificação exata, nesses casos nossa plataforma não é capaz de converter esses caracteres especiais adequadamente. Este problema é resolvido fornecendo ' UTF-8 ' como uma codificação de caracteres. Java fornece outro construtor sobrecarregado na classe String que aceita codificação de caracteres.
new String(byte[], 'character encoding');
Exemplo
No exemplo a seguir, usamos Conjunto de caracteres padrão.UTF_8 para especificar a codificação.
import java.io.IOException; import java.nio.charset.StandardCharsets; public class ByteArraytoStringExample1 { public static void main(String[] args) { try { byte[] b = 'Morning'.getBytes(StandardCharsets.UTF_8); //byte array String string = new String(b, StandardCharsets.UTF_8); //string with 'UTF-8' encoding System.out.println(string); } catch(Exception e) { e.printStackTrace(); } } }
Saída:
Exemplo
No exemplo a seguir, pegamos char ao criar a matriz de bytes. Funciona por causa do autoboxing. O caractere 'T' está sendo convertido para 84 na matriz de bytes e assim por diante. É por isso que a saída de ambas as matrizes de bytes é a mesma.
public class ByteArraytoStringExample2 { public static void main(String[] args) { byte[] byteArray = { 'T', 'E', 'C', 'H', 'N', 'O','L','O','G','Y'}; //byte array of characters byte[] byteArray1 = { 84, 69, 67, 72, 78, 79, 76, 79, 71, 89}; //array of ASCII values String s = new String(byteArray); //converts byteArray to String String str = new String(byteArray1); System.out.println(s); System.out.println(str); } }
Saída:
A classe String também possui um construtor no qual podemos passar array de bytes e Charset como argumento. Portanto, a instrução a seguir também pode ser usada para converter a matriz de bytes em String em Java.
String str = new String(byteArray, StandardCharsets.UTF_8)
A classe String também possui um construtor para converter um subconjunto da matriz de bytes em String.
String(byte[] bytes, int offset, int length, String charsetName)
Vejamos outro exemplo em que uma codificação diferente é usada.
Exemplo
import java.io.UnsupportedEncodingException; public class ByteArraytoStringExample3 { public static void main(String args[]) { try { byte[] bytes = new byte[] { 75, 69, 82, 115, 121, 90, 43, 98, -30}; //bytes in ASCII code String utf = new String(bytes, 'UTF-8'); //converts into UTF-8 encoding String cp1252 = new String(bytes, 'Cp1252'); //conversts into Cp1252 endcoding //converts into windows-1252 encoding String windows1252 = new String(bytes, 'Windows-1252'); System.out.println('String in UTF-8 encoding : ' + utf); System.out.println('String in Cp1252 encoding : ' + cp1252); System.out.println('string Windows-1252 encoding : ' + windows1252); } catch(Exception e) { e.printStackTrace(); } } }
Saída: