Dos três
qual é o mais preferido na vida real para E / S de arquivo em Java e por quê?
Prefiro canais para que dados binários sejam colocados em arquivo ou lidos e BufferedReader / Writer for String data
Dos três
Respostas:
java.io usa Streams
while java.nio use Channels
and buffer
, A distinção mais importante entre java.io way e java.nio way é, como os dados são empacotados e transmitidos.java.io lida com dados em fluxos (um byte por vez), enquanto java.nio lida com dados em blocos. O processamento de dados pelo bloco pode ser muito mais rápido que pelo byte (transmitido), mas não é tão fácil quanto os fluxos.
Nessas situações, é melhor usar o modo java.io:
Nessas situações, é melhor usar o java.nio:
Você pode ver os seguintes links para obter mais informações:
http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/
http://blogs.oracle.com/slc/entry/javanio_vs_javaio
qual é o mais preferido na vida real para E / S de arquivo em Java e por quê?
Realmente deveria ser uma questão de função e não de preferência.
Você usa Readers and Writers para dados orientados a caracteres (o que requer codificação e decodificação), Input / OutputStreams para dados orientados a bytes e fluxos binários, se os dados codificarem dados binários.
Você usa as classes BufferedXxx se precisar E / S na granularidade de um caractere ou byte. Eles são uma maneira simples de evitar os sérios problemas de desempenho que podem ocorrer se você executar vários syscalls de leitura e gravação de bytes de cada vez.
Se você fizer E / S apenas lendo / gravando grandes blocos, as classes BufferedXxx poderão realmente reduzir um pouco a taxa de transferência. Você pode usar leitores / gravadores / fluxos comuns (com grandes char[]
ou byte[]
buffers) ou Canais e XxxBuffers. Os últimos são potencialmente mais rápidos, mas as APIs são mais complicadas.
Você usa Canais se precisar de custos indiretos baixos e / ou faz coisas especializadas, como "selecionar" a partir de vários fluxos, dispersão / coleta e acesso a arquivos mapeados na memória.
Como você pode ver, as diferentes APIs foram projetadas para diferentes propósitos. Em alguns casos de uso, há sobreposição; em outros, apenas uma API é adequada para essa finalidade.
O problema com o desenvolvimento de uma "preferência" por um estilo de E / S em relação a outro é que isso leva a um software ruim; ou seja, código que é ineficiente onde a eficiência de E / S é necessária ou excessivamente complicado onde a eficiência de E / S não deve ser uma preocupação.
read
ou das write
chamadas que um aplicativo faz. Se todas elas forem grandes (o suficiente), leem e gravam para / de uma matriz de bytes, ignoram os buffers BufferedXxx e mapeiam diretamente as chamadas de leitura / gravação no fluxo subjacente. Nesse caso específico, os wrappers BufferedXxx não estão ajudando o desempenho.
A resposta é "Depende" - as E / S com buffer, streaming, bloqueio e sem bloqueio são usadas para finalidades diferentes, dependendo da simultaneidade, taxa de transferência e outras características de desempenho que você procura.