Java IO (JavaSE 6) - Ajuda-me a entender os efeitos do meu uso amostra de Córregos e Escritores

StackOverflow https://stackoverflow.com/questions/2243441

  •  19-09-2019
  •  | 
  •  

Pergunta

BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

Então, deixe-me ver se eu entendi isso: Um fluxo de saída byte é aberto para o arquivo "out.txt". Em seguida, é alimentado a um fluxo de saída tamponado para fazer operações de arquivo mais rápido. A corrente é alimentada tamponada a um gravador de fluxo de saída a ponte de bytes para caracteres. Finalmente, este escritor é alimentado para um escritor tamponada ... que acrescenta outra camada de buffer?

Hmm ...

Foi útil?

Solução

Sim, você está correto.

Eu acho que neste caso, você poderia fazer muito mais curto (ver também BufferedWriter )

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out"));

ou se você quiser funções agradável impressão:

PrintWriter out = new PrintWriter (novo BufferedWriter (new FileWriter ( "foo.out")));

É possivelmente que o FileWriter cria a sua própria embalagem, mas que a classe vai saber qual caminho é o melhor.

Em Java Córregos e escritores são wrappers para que você possa montá-los às suas próprias necessidades (por meio de empilhá-los como você faz). As classes não olhar para que tipo de stream / escritor eles se comportam diante. No seu caso com vários buffers irá significar que você realmente tem dois buffers, em duas classes diferentes. Isso significa que eles vão tomar alguma memória extra e possivelmente alguma perda de desempenho, mas muito provavelmente você nunca vai notar isso (porque é apenas um pouco de sobrecarga em comparação com outros fatores de desempenho).

Outras dicas

Este é um exemplo do decorador padrão . A idéia é adicionar funcionalidade a uma classe sem modificar a classe. No seu exemplo você tem um FileWriter. Você quer que tudo o que você escreve para ser tamponado (boa idéia se é através da rede) antes de escrever. Então você camada BufferedWriter no topo de FileWriter. Outros aplicativos podem não querer que os dados sejam tamponada para que os desenvolvedores não precisará adicionar um BufferedWriter.

Não podemos antecipar o que todos os desenvolvedores irá precisar. Digamos que você precisa rot13 seus dados, agora, em vez de modificar FileWriter, você cria uma chamada classe Rot13Writer que implementa Writer. O Rot13Writer terá uma instância do escritor e irá realizar rot13 antes de passá-lo para o próximo escritor.

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