国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

4種java復制文件的方式

2019-11-26 15:02:15
字體:
來源:轉載
供稿:網友

盡管Java提供了一個可以處理文件的IO操作類,但是沒有一個復制文件的方法。復制文件是一個重要的操作,當你的程序必須處理很多文件相關的時候。然而有幾種方法可以進行Java文件復制操作,下面列舉出4中最受歡迎的方式。

1. 使用FileStreams復制

這是最經典的方式將一個文件的內容復制到另一個文件中。 使用FileInputStream讀取文件A的字節,使用FileOutputStream寫入到文件B。 這是第一個方法的代碼:

private static void copyFileUsingFileStreams(File source, File dest)    throws IOException {    InputStream input = null;    OutputStream output = null;    try {      input = new FileInputStream(source);      output = new FileOutputStream(dest);          byte[] buf = new byte[1024];          int bytesRead;          while ((bytesRead = input.read(buf)) > 0) {        output.write(buf, 0, bytesRead);      }  } finally {    input.close();    output.close();  }}

正如你所看到的我們執行幾個讀和寫操作try的數據,所以這應該是一個低效率的,下一個方法我們將看到新的方式。

2. 使用FileChannel復制

Java NIO包括transferFrom方法,根據文檔應該比文件流復制的速度更快。這是第二種方法的代碼:

private static void copyFileUsingFileChannels(File source, File dest) throws IOException {      FileChannel inputChannel = null;      FileChannel outputChannel = null;    try {    inputChannel = new FileInputStream(source).getChannel();    outputChannel = new FileOutputStream(dest).getChannel();    outputChannel.transferFrom(inputChannel, 0, inputChannel.size());  } finally {    inputChannel.close();    outputChannel.close();  }}

3. 使用Commons IO復制

Apache Commons IO提供拷貝文件方法在其FileUtils類,可用于復制一個文件到另一個地方。它非常方便使用Apache Commons FileUtils類時,您已經使用您的項目。基本上,這個類使用Java NIO FileChannel內部。 這是第三種方法的代碼:

private static void copyFileUsingApacheCommonsIO(File source, File dest)    throws IOException {  FileUtils.copyFile(source, dest);}

4. 使用Java7的Files類復制

如果你有一些經驗在Java 7中你可能會知道,可以使用復制方法的Files類文件,從一個文件復制到另一個文件。 這是第四個方法的代碼:

private static void copyFileUsingJava7Files(File source, File dest)    throws IOException {      Files.copy(source.toPath(), dest.toPath());}

5. 測試

現在看到這些方法中的哪一個是更高效的,我們會復制一個大文件使用每一個在一個簡單的程序。 從緩存來避免任何性能明顯我們將使用四個不同的源文件和四種不同的目標文件。 讓我們看一下代碼:

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.channels.FileChannel;import java.nio.file.Files;import org.apache.commons.io.FileUtils; public class CopyFilesExample {   public static void main(String[] args) throws InterruptedException,      IOException {     File source = new File("C://Users//nikos7//Desktop//files//sourcefile1.txt");    File dest = new File("C://Users//nikos7//Desktop//files//destfile1.txt");     // copy file using FileStreams    long start = System.nanoTime();    long end;    copyFileUsingFileStreams(source, dest);    System.out.println("Time taken by FileStreams Copy = "        + (System.nanoTime() - start));     // copy files using java.nio.FileChannel    source = new File("C://Users//nikos7//Desktop//files//sourcefile2.txt");    dest = new File("C://Users//nikos7//Desktop//files//destfile2.txt");    start = System.nanoTime();    copyFileUsingFileChannels(source, dest);    end = System.nanoTime();    System.out.println("Time taken by FileChannels Copy = " + (end - start));     // copy file using Java 7 Files class    source = new File("C://Users//nikos7//Desktop//files//sourcefile3.txt");    dest = new File("C://Users//nikos7//Desktop//files//destfile3.txt");    start = System.nanoTime();    copyFileUsingJava7Files(source, dest);    end = System.nanoTime();    System.out.println("Time taken by Java7 Files Copy = " + (end - start));     // copy files using apache commons io    source = new File("C://Users//nikos7//Desktop//files//sourcefile4.txt");    dest = new File("C://Users//nikos7//Desktop//files//destfile4.txt");    start = System.nanoTime();    copyFileUsingApacheCommonsIO(source, dest);    end = System.nanoTime();    System.out.println("Time taken by Apache Commons IO Copy = "        + (end - start));   }   private static void copyFileUsingFileStreams(File source, File dest)      throws IOException {    InputStream input = null;    OutputStream output = null;    try {      input = new FileInputStream(source);      output = new FileOutputStream(dest);      byte[] buf = new byte[1024];      int bytesRead;      while ((bytesRead = input.read(buf)) > 0) {        output.write(buf, 0, bytesRead);      }    } finally {      input.close();      output.close();    }  }   private static void copyFileUsingFileChannels(File source, File dest)      throws IOException {    FileChannel inputChannel = null;    FileChannel outputChannel = null;    try {      inputChannel = new FileInputStream(source).getChannel();      outputChannel = new FileOutputStream(dest).getChannel();      outputChannel.transferFrom(inputChannel, 0, inputChannel.size());    } finally {      inputChannel.close();      outputChannel.close();    }  }   private static void copyFileUsingJava7Files(File source, File dest)      throws IOException {    Files.copy(source.toPath(), dest.toPath());  }   private static void copyFileUsingApacheCommonsIO(File source, File dest)      throws IOException {    FileUtils.copyFile(source, dest);  } }

輸出:

Time taken by FileStreams Copy = 127572360Time taken by FileChannels Copy = 10449963Time taken by Java7 Files Copy = 10808333Time taken by Apache Commons IO Copy = 17971677

正如您可以看到的FileChannels拷貝大文件是最好的方法。如果你處理更大的文件,你會注意到一個更大的速度差。這是一個示例,該示例演示了Java中四種不同的方法可以復制一個文件。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 恩平市| 宾阳县| 伊通| 繁昌县| 开化县| 灌云县| 怀安县| 永济市| 兴隆县| 安福县| 资溪县| 集安市| 明溪县| 承德县| 濮阳县| 公主岭市| 朔州市| 泸州市| 长乐市| 望城县| 莲花县| 安溪县| 志丹县| 昌宁县| 荆门市| 鄂托克前旗| 武汉市| 霸州市| 绥阳县| 开原市| 九龙坡区| 云霄县| 汾西县| 阿拉善右旗| 麻城市| 安国市| 诸暨市| 长子县| 准格尔旗| 石狮市| 平远县|