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?
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?
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);
fonte
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.
fonte
read()
byte por byte e quando usarread(byte[])
array de bytes. Como eu acho que ler array é sempre melhor. então você pode me dar um exemplo de onde usarread()
byte por byte OUread(byte[])
array de bytes. OUBufferedInputStream
.?Acho que a fonte de confusão é que
InputStream.read()
retorna umint
eReader.read()
também retorna umint
.A diferença é que
InputStream.read()
retornam valores de byte entre 0 e 255 correspondentes ao conteúdo bruto do fluxo de bytes eReader.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 umint
entre 0 e 255) resultando em97
,226
,128
,161
e97
ondea -> 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 caracteres97
,8225
e97
ondea -> 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
fonte
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.
fonte
Um aceita bytes e o outro aceita caracteres.
fonte
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.
fonte