Qual é a diferença entre Reader e InputStream? E quando usar o quê? Se eu posso usar o Reader para ler caracteres, por que usarei o inputstream, acho que para ler objetos?
Qual é a diferença entre Reader e InputStream? E quando usar o quê? Se eu posso usar o Reader para ler caracteres, por que usarei o inputstream, acho que para ler objetos?
Respostas:
Um InputStream é o método bruto de obter informações de um recurso. Ele pega os dados byte por byte sem realizar qualquer tipo de tradução. Se você estiver lendo dados de imagem ou qualquer arquivo binário, este é o fluxo a ser usado.
Um leitor é projetado para fluxos de caracteres. Se todas as informações que você está lendo forem de texto, o Reader cuidará da decodificação de caracteres para você e fornecerá caracteres Unicode do fluxo de entrada bruto. Se você estiver lendo qualquer tipo de texto, este é o stream a ser usado.
Você pode encapsular um InputStream e transformá-lo em um Reader usando a classe InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams são usados para ler bytes de um stream. Portanto, eles são úteis para dados binários, como imagens, vídeo e objetos serializados.
Os leitores, por outro lado, são fluxos de caracteres, portanto, são mais bem usados para ler dados de caracteres.
read()
byte por byte e quando usar read(byte[])
array de bytes. Como eu acho que ler array é sempre melhor. então você pode me dar um exemplo de onde usar read()
byte por byte OU read(byte[])
array de bytes. OU BufferedInputStream
.?
Acho que a fonte de confusão é que InputStream.read()
retorna um int
e Reader.read()
também retorna um int
.
A diferença é que InputStream.read()
retornam valores de byte entre 0 e 255 correspondentes ao conteúdo bruto do fluxo de bytes e Reader.read()
retornam o valor do caractere que está entre 0 e 65357 (porque existem 65358 pontos de código Unicode diferentes)
Um InputStream
permite ler o conteúdo byte por byte, por exemplo, os conteúdos "um ‡ um" são lidos como um fluxo de 5 bytes (cada um representado como um int
entre 0 e 255) resultando em 97
, 226
, 128
, 161
e 97
onde
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
A Reader
permite que você leia o conteúdo caractere por caractere para que o conteúdo "a ‡ a" seja lido como 3 caracteres 97
, 8225
e 97
onde
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97
O caractere ‡ é referido como U + 2021 em Unicode
Histórico do InputStream & Reader:
Nos primeiros dias do java, a única maneira de realizar a entrada do console era usar um fluxo de bytes (InputStream e OutputStream).
Casos de uso:
Hoje, usar um fluxo de bytes para ler o fluxo do console também é aceitável. No entanto, para aplicativos comerciais, o método preferido para ler a entrada do console é usar o fluxo orientado a caracteres (Leitor). O Reader torna mais fácil internacionalizar e manter.
Nota: Esta é apenas uma informação extra para explorar códigos de E / S Java é que, o padrão de design da implementação de E / S Java segue o padrão de design do decorador. Se você estiver familiarizado com o padrão de design do decorador, poderá facilmente acompanhar a implementação.
Um aceita bytes e o outro aceita caracteres.
InputStream aceita byte , Leitor aceita caractere, Em Java, um caractere = dois bytes e Leitor usa buffer, InputStream não usa. Todo arquivo armazenado em disco ou transferência baseado em byte, inclui imagem e vídeo, mas o personagem está na memória, então InputStream é usado freqüentemente.