Copia file Java (modifica dimensione buffer)
A Giava java.io.InputStream,,java.io.OutputStream A
Presentazione di un programma di esempio che esegue l'elaborazione della copia utilizzando flussi di input/output.
Nell'elaborazione della copia utilizzando i flussi, anche i file di grandi dimensioni possono essere copiati in tempi relativamente brevi aumentando la dimensione del buffer di lettura.
Nel programma di esempio, la dimensione del buffer di lettura dei dati può essere specificata con un argomento.
L'area del buffer di lettura specificata è protetta all'interno dell'heap JavaVM, quindi renderla troppo grande comporterà una scarsa efficienza. Pertanto, controlliamo anche l'efficiente dimensione del buffer di lettura dei dati durante la copia dei file.
programma di esempio
/**
* Scrive i dati dal flusso di input al flusso di output.
*Il flusso di input/output verrà chiuso una volta completato il processo di copia.
* @param nel flusso di input
* Flusso di output @param os
* @param bufferSize Dimensione del buffer di lettura dei dati (KB).
* @throws IOException Se si verifica qualche eccezione nell'elaborazione di input/output
*/
public static void copyStream(InputStream in, OutputStream os,
int bufferSize) genera IOException {
int len=-1;
byte[] b = nuovo byte[dimensione buffer * 1024];
Tentativo {
while ((len = in.read(b, 0, b.lunghezza)) != -1) {
os.write(b, 0, len);
}
os.flush();
} Finalmente {
se (in != null) {
Tentativo {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
se (os!= null) {
Tentativo {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
esecuzione
Per copiare il file di programma di esempio, abbiamo preparato un file da 100 MB "100M.txt" direttamente sotto l'unità C. Nel programma di esempio, C:\100M.txt , legge i dati in unità con dimensioni del buffer pari a 1000 KB. C:\a.txt Copia a.
L'esempio è stato eseguito nel seguente ambiente.
Sistema operativo: Windows XP
Processore: Athlon 1,46GHz
Memoria: 1 GB
JRE: 1.6.4
◆Esempio di esecuzione
/** * Esempio di esecuzione * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } catch (IOException e) { e.printStackTrace(); } }
Modifica della dimensione del buffer
Per verificare l'efficiente dimensione del buffer di lettura dei dati durante la copia dei file, impostare il terzo argomento di copyStream su
Di seguito sono riepilogati i risultati di un'elaborazione di copia simile in unità da 1 KB, 100 KB, 1000 KB e 10000 KB.
Sebbene non si possa concludere solo dai risultati precedenti, se si specifica la dimensione del buffer di lettura dei dati in unità di 1000 KB,
I risultati hanno mostrato che era efficiente in termini di utilizzo dell'heap e tempo di elaborazione durante l'elaborazione della copia.
Risultati simili sono stati ottenuti anche aumentando la dimensione del file (circa 1 GB).
D'altra parte, quando si copia un file di piccole dimensioni (circa 1 MB o meno), aumentare la dimensione del buffer sarà uno spreco, quindi penso che sia meglio specificare circa 100 KB.
Utilizza FileChannel per velocità più elevate
java.io.InputStream,,java.io.OutputStream
L'elaborazione della copia è importante per comprendere i flussi di input/output, ma
Nuovo I/O introdotto in J2SE1.4 java.nio.channels.FileChannel#transferTo
Utilizzando questo metodo, puoi copiare i file in modo ancora più efficiente.
Successivamente, ti mostrerò come copiare facilmente e rapidamente i file utilizzando FileChannel.
⇒ Copia file Java (facile e veloce)