複製文件
思路:
- 創建
FileInputStream
的對象fis
,關聯源文件。 - 創建
FileOutputStream
的對象fos
,關聯目標文件 - 創建字節流bytes(
byte[]
類型),使用循環,通過fis
的read
方法把源文件字節讀入字節流,函數參數是字節流,返回值是讀取的有效字節數。同時,通過fos
把字節流寫入目標文件,當read
方法返回-1
,說明讀取到了源文件的結束標誌
。 - 關閉輸入輸出流
代碼實現
private static void copyFileByBytes(File srcFile, File destFile) throws IOException {
long startTime = System.currentTimeMillis();
// 1.創建InputStream,關聯源文件
FileInputStream fis = new FileInputStream(srcFile);
// 2.創建OutputStream,關聯目標文件
FileOutputStream fos = new FileOutputStream(destFile);
// 3.逐字節讀取視頻源文件,逐字節寫入目標文件,速度非常的慢
/*
int b=-1;
while((b = fis.read()) != -1){
fos.write(b);
}
*/
// 優化:使用字符數組從源文件逐字節段讀入字節數組(字節流),再逐字節段寫入目標文件
// 注意事項: 逐字節讀取read返回值是讀取的字節,遇到文件結束符讀取的值爲-1
// 逐字節段讀取,read返回值是讀取到的有效字節長度,read接受的參數是一個字符數組,把讀取到的字節放入字節數組(字節流)
byte[] bytes = new byte[1024 * 10];
int len = -1;
while ((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
// 4.關閉流
fos.close();
fis.close();
long endTime = System.currentTimeMillis();
System.out.println("批量讀取用時:" + (endTime - startTime) + "毫秒");
}
總結
-
批量的把字節流寫入文件要限定寫入字節流長度,因爲字節流中的數據是覆蓋進行刷新的,如圖
源文件讀取完畢以後,字節流中內容如圖所示,因爲第三次讀取了2個字節的有效數據,所以字節流中還保留着第二次讀取的一部分剩餘內容。 -
讀取到文件結束標誌,返回值爲-1。