Vamos supor que eu apenas usei a BufferedInputStream
para ler os bytes de um arquivo de texto codificado em UTF-8 em uma matriz de bytes. Eu sei que posso usar a rotina a seguir para converter os bytes em uma cadeia de caracteres, mas existe uma maneira mais eficiente / inteligente de fazer isso do que apenas percorrer os bytes e converter cada um?
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 fileString = new String(_bytes,"UTF-8");
?byte[]
na memória e convertê-lo vianew String(_bytes,"UTF-8")
(ou mesmo por pedaços com+=
a sequência) é o mais eficiente. O encadeamento de InputStreams e Readers pode funcionar melhor, especialmente em arquivos grandes.Respostas:
Olhe o construtor para String
E se você estiver com preguiça, poderá usar a biblioteca Apache Commons IO para converter diretamente o InputStream em uma String:
fonte
java.nio.charset.Charset.availableCharsets()
mapa todos os caracteres, não apenas os caracteres noStandardCharsets
. E se você quiser usar algum outro conjunto de caracteres e ainda assim impedir que o construtor String seja lançado,UnsupportedEncodingException
você pode usarjava.nio.charset.Charset.forName()
A classe Java String possui um construtor interno para converter a matriz de bytes em sequência.
fonte
Para converter dados utf-8, você não pode assumir uma correspondência 1-1 entre bytes e caracteres. Tente o seguinte:
(Bah. Vejo que estou muito lento ao pressionar o botão Postar sua resposta.)
Para ler um arquivo inteiro como uma String, faça algo assim:
fonte
Você pode usar o
String(byte[] bytes)
construtor para isso. Veja este link para detalhes. EDIT Você também deve considerar o conjunto de caracteres padrão do seu plateform conforme o documento java:fonte
Charset
argumento para garantir que a conversão esteja correta.Você pode usar os métodos descritos nesta pergunta (especialmente desde que você começa com um InputStream): Leia / converta um InputStream em uma String
Em particular, se você não deseja confiar em bibliotecas externas, pode tentar esta resposta , que lê a
InputStream
via aInputStreamReader
em umchar[]
buffer e a anexa em aStringBuilder
.fonte
Sabendo que você está lidando com uma matriz de bytes UTF-8, definitivamente desejará usar o construtor String que aceita um nome de conjunto de caracteres . Caso contrário, você poderá se deixar aberto a algumas vulnerabilidades de segurança baseadas em codificação de charset. Observe que ele lança com o
UnsupportedEncodingException
qual você terá que lidar. Algo assim:fonte
Aqui está uma função simplificada que lê em bytes e cria uma string. Supõe-se que você provavelmente já saiba em que codificação está o arquivo (e de outra forma é o padrão).
fonte
String possui um construtor que usa byte [] e charsetname como parâmetros :)
fonte
Isso também envolve iterar, mas isso é muito melhor do que concatenar cadeias, pois são muito, muito caras.
fonte
String str = new String(byte[])
vai fazer muito bem.Por que não obter o que procura desde o início e ler uma sequência do arquivo em vez de uma matriz de bytes? Algo como:
depois leia oLinha de dentro até que esteja pronto.
fonte
Eu uso assim
String strIn = new String(_bytes, 0, numBytes);
fonte