O que é preferido para E / S de arquivo em Java? [fechadas]


8

Dos três

  • BufferedReader / Writer
  • Fluxos Binários
  • Canais

  • 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

    Respostas:


    18

    java.io usa Streamswhile java.nio use Channelsand 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:

    • Os arquivos podem ser grandes, mas não enormes. É possível ler um arquivo inteiro na memória.
    • Um aplicativo lê ou grava em apenas alguns arquivos ou conexões de rede ao mesmo tempo, idealmente usando apenas um fluxo por vez.
    • O aplicativo é seqüencial. Não será possível fazer muito até terminar de ler ou gravar um arquivo.

    Nessas situações, é melhor usar o java.nio:

    • Um aplicativo que precisa atender centenas ou milhares de conexões simultaneamente.

    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

    https://www.ibm.com/developerworks/java/tutorials/j-nio/

    http://java.dzone.com/articles/java-nio-vs-io


    Acho os canais mais fáceis que os fluxos java.io.
    Manequim de Derp

    7
    Bom para você, porque quase todos (como eu) dizem que o modelo de programação nio é complicado que o java io tradicional.
    Saeed Zarinfam 10/09/12

    4

    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.


    "Se você fizer E / S apenas lendo / gravando grandes blocos, as classes BufferedXxx podem realmente reduzir um pouco a taxa de transferência." ... Eu não entendi esse ponto. O ponto principal de usar o BufferedXxx em primeiro lugar é que você faça E / S por partes e não por byte / caractere único etc, e isso reduz o número de chamadas do sistema ao kernel? Você pode, por favor, explicar o que exatamente você quis dizer?
    30714 Geek

    Estou me referindo ao tamanho do real readou das writechamadas 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.
    Stephen C

    Eu vejo o que você estava fazendo. Obrigado pelo seguimento. +1.
    31514 Geek

    3

    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.

    Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
    Licensed under cc by-sa 3.0 with attribution required.