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
Linkar esta publicação | Assine os comentários via o RSS