Qual é a diferença entre Reader e InputStream?

87

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?

sab
fonte
3
Em relação a "Eu acho que para ler objetos?", Existem fluxos de entrada / saída especiais para leitura / gravação de objetos Java. Eles são ObjectInputStream e ObjectOutputStream respectivamente e fazem parte de uma estrutura de serialização maior. java.sun.com/developer/technicalArticles/Programming/… Mas esse é apenas um uso de fluxos de entrada / saída, outros podem enviar dados por um soquete, etc.
Mark Peters

Respostas:

138

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);
Berin Loritsch
fonte
resposta perfeita Berin! Obrigado!
Gaurav
18

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.

Vincent Ramdhanie
fonte
Quando usar 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.?
Asif Mushtaq de
11

Acho que a fonte de confusão é que InputStream.read()retorna um inte 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 InputStreampermite 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 intentre 0 e 255) resultando em 97, 226, 128, 161e 97onde

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 Readerpermite que você leia o conteúdo caractere por caractere para que o conteúdo "a ‡ a" seja lido como 3 caracteres 97, 8225e 97onde

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

RubenLaguna
fonte
Esta deve ser a resposta aceita. Obrigado pelo exemplo
painel
2

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.

Atif
fonte
1

Um aceita bytes e o outro aceita caracteres.

Aaron McIver
fonte
0

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.

LiLi
fonte