Pergunta

Estou escrevendo um OutputStream, só notei isso na interface OutputStream,

   public abstract void write(int b) throws IOException;

Esta gravação chamada um byte para o fluxo, mas por que leva inteiro como um argumento?

Foi útil?

Solução

Na verdade, eu tenho trabalhado com bytes um pouco ultimamente e que pode ser irritante. Eles up-convertido ao ints à menor provocação e não há nenhuma designação para transformar um número em um byte - por exemplo, 8l lhe dará um valor longo 8, mas para byte você tem a dizer (byte) 8

Além disso, eles vão (praticamente) ser sempre armazenados internamente como ints menos que você estiver usando uma matriz (e talvez até então .. não tenho certeza).

Eu acho que eles apenas praticamente assumir que a única razão para usar um byte é i / o que você realmente precisa de 8 bits, mas internamente eles esperam que você use sempre ints.

A propósito, um byte pode executar pior, uma vez que sempre tem que ser mascarado ...

Pelo menos eu lembro de ter lido que, anos atrás, poderia ter mudado agora.

Como exemplo resposta para sua pergunta específica, se uma função (f) tomou um byte, e você tinha dois bytes (B1 e B2), então:

f(b1 & b2)

não iria funcionar, porque b1 e b2 seria up-convertido para um int eo int não poderiam ser convertidos automaticamente (perda de precisão). Então você teria que código:

f( (byte)(b1 & b2) )

Que iria ficar irritante.

E não se incomode perguntando por b1 e up-convertidos b2 - Eu estive cussing que um pouco ultimamente me

Outras dicas

Assim, você pode sinalizar EOF:

"Note que read () retorna um valor int. Se a entrada é um fluxo de bytes, por que não lê () retorna um valor de bytes? Usando um int como um tipo de retorno permite ler () para usar -1 para indicar que ele atingiu o fim do fluxo ".

http://java.sun.com/docs/ livros / tutorial / essencial / io / bytestreams.html

de acordo com javadoc para OutputStream , os 24 bits de alta ordem são ignorados por esta função. eu acho que existe o método por razões de compatibilidade: portanto, você não precisa converter para byte primeiro e você pode simplesmente passar um inteiro

.

relação

As classes Java iostream ter sido uma parte de Java desde 1.0. Essas classes apenas lidar com dados de 8 bits. Meu palpite é que a interface foi projetada como esta para que o (int b) um método de gravação seria chamado para valores int, short, byte, e de char. Estes são todos promovidos para um int. Na verdade desde que a maioria JVMs rodar em máquinas de 32 bits, o int primitivo é o tipo mais eficiente para lidar com eles. O compilador é livre para tipos de armazenamento, tais como bytes utilizando 32 bits de qualquer maneira. Curiosamente, byte [] realmente é armazenado como uma sequência de bytes de 8 bits. Isso faz sentido, já que um array pode ser bastante grande. No entanto, no caso de valores primitivos individuais, como int ou byte, o espaço máximo ocupado em tempo de execução realmente não importa, desde que o comportamento é consistente com a especificação.

Mais fundo:

http://www.java-samples.com/showtutorial.php ? tutorialid = 260

O pressuposto para as classes iostream é que o chamador realmente só se preocupa com menor 8 bits de dados, mesmo quando passam em um int. Isso é bom, desde o chamador sabe que está realmente lidando com bytes, mas se torna um problema quando dados subjacentes é realmente texto que usa alguma outra codificação de caracteres, tais como multi-byte Unicode. É por isso que as classes leitor foram introduzido com o Java 1.1. Se você se preocupa com dados de texto e desempenho, as classes iostream são mais rápidos, mas as classes leitor são mais portáteis.

Talvez seja porque bytes são assinados por padrão, e armazenar arquivos de bytes como valores não assinados. É por isso que read() retorna um int - para dar 255 ao invés de -1 por US $ FF. Mesmo com write(int), você não pode armazenar $ FF como 255 em um byte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top