Tetris Prêmio IgNobel 2007

Copiando arquivos em Java

17 de Setembro de 2007 às 13:48 Thiago  | Enviar por e-mail Hits para esta publicação: 569

Um código simples que usei para copiar um arquivo (na verdade, uso para copiar de um InputStream para um OutputStream):

InputStream in = (...)
OutputStream out = (...)
for (int b = in.read(); b != -1; out.write(b), b = in.read());

Publicação arquivada em: Tecnologia

Enviar por e-mail | Hits para esta publicação: 570

5 Comentários Faça seu próprio

  • 1. Thiago  |  17 de Setembro de 2007 às 13:52

    Com while fica mais simples de entender.

    int b = -1;
    while ( (b = in.read()) != -1) {out.write(b);}

    Hum…

    for (int b = in.read(); (b = in.read()) != -1; out.write(b));

    Hehe, fica menor.

  • 2. ThiagoHP  |  18 de Setembro de 2007 às 14:16

    Alguns comentários não muito construtivos.
    1) Deve-se usar as classes BufferedInputStream e BufferedOutputStream. Faz uma diferença de desempenho da ordem de umas 100 vezes.
    2) Não tá legível. A versão com while tá bem melhor. :)
    3) Engraçado a classe File não ter um método para fazer cópia de arquivos. Dessa maneira que tá escrita aqui, o arquivo é carregado em memória e depois escrito. Um cp de Linux não faria isso.

  • 3. Thiago  |  19 de Setembro de 2007 às 11:11

    Respondendo ao HP:

    1) Isso é verdade. Escrevi o código originalmente para usar como debug, então não me preocupei com buffering. Eu costumo fazer o buffering eu mesmo:

    byte[] lb = new byte[1024];
    int t = 0;
    while ( (t = in.read(lb)) != -1) {
    out.write(lb, 0, t);
    }

    Tenho a impressão que assim é mais eficiente, mas preciso medir.

    2) A versão com while é realmente melhor. :) Fazer com o for foi só para exercitar mesmo. Às vezes é bom tentar escrever códigos não ortodoxos pois pode ajudar a compreender outros conceitos ou simplesmente manter uma mente mais aberta, menos viciada.

    3) Fiz isso porque no código original a situação é diferente. Eu leio um arquivo, o altero na memória e depois gravo isso. Então no meu caso o InputStream é um SequenceInputStream de alguns ByteArrayInputStream e meu OutputStream é um FileOutputStream.

    Aparentemente em Java não há função na biblioteca para copiar de um arquivo para outro.

    Em relação ao “cp”, faz sentido o arquivo ficar temporariamente em memória, não? Eu acho que não dá para copiar direto de HD para HD.

  • 4. eric  |  22 de Setembro de 2007 às 15:45

    Definitivamente o cp precisa ler o arquivo para a memória para poder copiá-lo!

  • 5. Thiago  |  27 de Setembro de 2007 às 17:08

    Já pensaram se tivéssemos uma mídia de armazenamento auto-replicável?

    Armazenar dados em DNA, por exemplo. Imagina como seria copiar um arquivo, heheh!

Deixe um Comentário

Requerido

Requerido,escondido

Linkar esta publicação  |  Assine os comentários via o RSS


Calendário

Setembro 2007
S T Q Q S S D
« Ago   Out »
 12
3456789
10111213141516
17181920212223
24252627282930

Minhas Publicações Recentes

Publicações por Mês

Estatísticas

Meta