Cópia do arquivo Java (alterar tamanho do buffer)
Em Java java.io.InputStream,,java.io.OutputStream no
Apresentando um programa de exemplo que executa processamento de cópia usando fluxos de entrada/saída.
No processamento de cópia usando fluxos, mesmo arquivos grandes podem ser copiados de forma relativamente rápida aumentando o tamanho do buffer de leitura.
No programa de exemplo, o tamanho do buffer de leitura de dados pode ser especificado com um argumento.
A área de buffer de leitura especificada é protegida no heap JavaVM, portanto, torná-la muito grande resultará em baixa eficiência. Portanto, também verificamos o tamanho eficiente do buffer de leitura de dados ao copiar arquivos.
programa de amostra
/**
* Grava dados do fluxo de entrada no fluxo de saída.
*O fluxo de entrada/saída será fechado após a conclusão do processo de cópia.
* @param no fluxo de entrada
* @param fluxo de saída do sistema operacional
* @param bufferSize Tamanho do buffer de leitura de dados (KB).
* @throws IOException Se ocorrer alguma exceção de processamento de entrada/saída
*/
public static void copyStream (InputStream in, OutputStream os,
int bufferSize) lança IOException {
int len = -1;
byte[] b = novo byte[bufferSize * 1024];
tentar {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
os.flush();
} finalmente {
if (em! = nulo) {
tentar {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os! = nulo) {
tentar {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
execução
Para copiar o arquivo de programa de amostra, preparamos um arquivo "100M.txt" de 100 MB diretamente na unidade C. No programa de exemplo, C:\100M.txt , leia os dados em unidades com tamanho de buffer de 1000 KB. C:\a.txt Copiar para.
A amostra foi executada no ambiente a seguir.
SO: WindowsXP
Processador: Athlon 1,46 GHz
Memória: 1GB
JRE: 1.6.4
◆Exemplo de execução
/** * Exemplo de execução * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } catch (IOException e) { e.printStackTrace(); } }
Alterando o tamanho do buffer
Para verificar o tamanho eficiente do buffer de leitura de dados ao copiar arquivos, defina o terceiro argumento de copyStream como
Os resultados de processamento de cópia semelhante em unidades de 1 KB, 100 KB, 1.000 KB e 10.000 KB estão resumidos abaixo.
Embora não se possa concluir apenas pelos resultados acima, se você especificar o tamanho do buffer de leitura de dados em unidades de 1000 KB,
Os resultados mostraram que ele foi eficiente em termos de uso de heap e tempo de processamento durante o processamento de cópias.
Resultados semelhantes foram obtidos mesmo quando o tamanho do arquivo foi aumentado (aproximadamente 1GB).
Por outro lado, ao copiar um arquivo pequeno (cerca de 1 MB ou menos), aumentar o tamanho do buffer será um desperdício, então acho melhor especificar cerca de 100 KB.
Use FileChannel para velocidades mais rápidas
java.io.InputStream,,java.io.OutputStream
O processamento de cópias é importante para a compreensão dos fluxos de entrada/saída, mas
Nova E/S introduzida no J2SE1.4 java.nio.channels.FileChannel#transferTo
Ao usar este método, você pode copiar arquivos com ainda mais eficiência.
A seguir, mostrarei como copiar arquivos de maneira fácil e rápida usando FileChannel.
⇒ Cópia de arquivo Java (fácil e rápida)