java 實現檔案複製的兩種方式
阿新 • • 發佈:2019-02-09
檔案複製首先我們要考慮的是用字元流還是檔案流操作呢?
若我們考慮的僅僅是文字之類的複製,字元流要好些。但是不可能總是文字檔案吧,有可能是聲音,影象,視訊等等,所以使用位元組流操作比較好。
複製的兩種方式
1.將原始檔中的內容全部讀取到記憶體中,並一次性寫入到目標檔案
2.不將原始檔中的內容全部讀取到記憶體中來,而是採取邊讀邊寫的方式
下面就是採用這兩種方法對比
Java程式碼
經測試發現,對於讀取檔案的大小小於自身機器的記憶體時,採取方式1要比方式二快很多,但是若讀取的檔案大於自身記憶體則方式二好些。不過在這種情況下有更好的方式就是採取緩衝機制,讀取一塊,寫入一塊。結合了一和二的優點。
若我們考慮的僅僅是文字之類的複製,字元流要好些。但是不可能總是文字檔案吧,有可能是聲音,影象,視訊等等,所以使用位元組流操作比較好。
複製的兩種方式
1.將原始檔中的內容全部讀取到記憶體中,並一次性寫入到目標檔案
2.不將原始檔中的內容全部讀取到記憶體中來,而是採取邊讀邊寫的方式
下面就是採用這兩種方法對比
Java程式碼
- package zzs.file.demo;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- publicclass FileCopy {
- private File inputFile;
- private File outputFile;
- private InputStream inputStream;
- private OutputStream outputStream;
- public FileCopy(String inputPath,String outputPath)
- inputFile=new File(inputPath);
- outputFile=new File(outputPath);
- inputStream=new FileInputStream(inputFile);
- outputStream=new FileOutputStream(outputFile);
- }
- //一次性把資料全部讀取到記憶體中來,再一次性寫入
- publicvoid copy1() throws IOException{
- byte b[]=newbyte[(int)inputFile.length()];
- inputStream.read(b); //一次性讀入
- outputStream.write(b); //一次性寫入
- // inputStream.close();
- // outputStream.close();
- }
- //邊讀邊寫
- publicvoid copy2() throws IOException{
- int temp=0;
- while((temp=inputStream.read())!=-1){
- outputStream.write(temp);
- }
- inputStream.close();
- outputStream.close();
- }
- public File getInputFile() {
- return inputFile;
- }
- publicvoid setInputFile(File inputFile) {
- this.inputFile = inputFile;
- }
- public File getOutputFile() {
- return outputFile;
- }
- publicvoid setOutputFile(File outputFile) {
- this.outputFile = outputFile;
- }
- publicstaticvoid main(String[] args) throws IOException{
- String inputPath="e:"+File.separator+"Xfire.rar";
- String outputPath="f:"+File.separator+inputPath.substring(inputPath.indexOf(File.separator));
- FileCopy fileCopy=new FileCopy(inputPath, outputPath);
- long start1=System.currentTimeMillis();
- fileCopy.copy1();
- long end1=System.currentTimeMillis();
- System.out.println("一次性全部讀入記憶體複製檔案大小為"+fileCopy.getInputFile().length()+"位花費時間為:"+(end1-start1)+"ms");
- fileCopy.getOutputFile().delete();
- long start2=System.currentTimeMillis();
- fileCopy.copy2();
- long end2=System.currentTimeMillis();
- System.out.println("邊讀邊寫複製檔案大小為"+fileCopy.getInputFile().length()+"位花費時間為:"+(end2-start2)+"ms");
- }
- }
經測試發現,對於讀取檔案的大小小於自身機器的記憶體時,採取方式1要比方式二快很多,但是若讀取的檔案大於自身記憶體則方式二好些。不過在這種情況下有更好的方式就是採取緩衝機制,讀取一塊,寫入一塊。結合了一和二的優點。