4种java复制文件的方式

尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法。复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。

1. 使用FileStreams复制

这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:

 1     private static void copyFileUsingFileStreams(File source, File dest)throws IOException {
 2         InputStream input = null;
 3         OutputStream output = null;
 4         try {
 5             input = new FileInputStream(source);
 6             output = new FileOutputStream(dest);
 7             byte[] buf = new byte[1024];
 8             int bytesRead;
 9             while ((bytesRead = input.read(buf)) > 0) {
10             output.write(buf, 0, bytesRead);
11             }
12         } finally {
13             input.close();
14             output.close();
15         }
16     }

正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。

 1 public static void copy(File source, File dest){
 2         InputStream input = null;
 3         OutputStream output = null;
 4
 5         try {
 6             input = new FileInputStream(source);
 7             output = new FileOutputStream(dest);
 8
 9             byte[] buff = new byte[1024*8];
10
11             int temp =0;
12             while( (temp = input.read(buff)) != -1){
13                 //将byte数组从0索引开始转换temp个
14                 //String str = new String(buff,0,temp);
15                 //System.out.println(str);
16                 output.write(buff,0,temp);
17             }
18         } catch (FileNotFoundException e) {
19             e.printStackTrace();
20         } catch (IOException e) {
21             e.printStackTrace();
22         }finally {
23             try {
24                 input.close();
25                 output.close();
26             } catch (IOException e) {
27                 // TODO Auto-generated catch block
28                 e.printStackTrace();
29             }
30         }
31     }

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类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:

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

5. 测试

现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

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);

}

}

输出:


1

2

3

4

Time taken by FileStreams Copy = 127572360

Time taken by FileChannels Copy = 10449963

Time taken by Java7 Files Copy = 10808333

Time taken by Apache Commons IO Copy = 17971677

正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。

时间: 2024-08-11 20:00:07

4种java复制文件的方式的相关文章

java复制文件与文件夹

复制文件或文件夹时,可以写一个方法,接受两个File类型参数.一个是要复制的文件,另一个是要复制的地方.方法具体大概是这样,先判断 源文件是文件还是文件夹,如是文件,就在目标路径里用字节流复制该文件.关键在于如何在目标路径里复制文件.可以创建一个File对象参数为目标对象+源文件.getName().如果是文件夹,就在目标路径里复制一个文件夹,即创建一个File对象构造参数为目标+源文件路径.getName. 在用File对象的 mkdir 在本地创建文件夹. 然后获取要复制的文件夹中的文件.遍

java 复制文件夹中epub、html、txt文件 (按原来文件夹存放)

原来文件夹中的文件:有epub/html/txt import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 复制文件夹中所有包含.epub后缀的文件 * @author fibre * parameter SUFFIX = ".epub&qu

JAVA复制文件最快的算法

/** * 复制文件 * * @param srcFile * 源文件File * @param destDir * 目标目录File * @param newFileName * 新文件名 * @return 实际复制的字节数,如果文件.目录不存在.文件为null或者发生IO异常,返回-1 */ public static long copyFile1(File srcFile, File destDir, String newFileName) { long copySizes = 0; i

java复制文件

package com.test.tes; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; /** * 复制文件到指定目录下 * @author Wdnncey * */ public class Copy { public static long forJava(File f1,File f2) throws Exceptio

java复制文件夹及所有子目录和文件

package text; import java.io.BufferedReader; 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.InputStrea

java 复制文件夹

//File.separator  斜杠使用 这个参数代替,解决java移植 到其其它平台兼容问题 String fsr=String.format("D:%sceshi", File.separator);//需要复制的文件夹 不包括ceshi String tsr=String.format("D:%sDownloads", File.separator);//需要复制到的文件夹 File f=new File(fsr); File t=new File(tsr

java复制文件夹中的所有文件和文件夹到另一个文件夹中

1.复制文件夹 public static void copyDir(String oldPath, String newPath) throws IOException { File file = new File(oldPath); String[] filePath = file.list(); if (!(new File(newPath)).exists()) { (new File(newPath)).mkdir(); } for (int i = 0; i < filePath.l

java复制文件的4种方式

1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是第一个方法的代码: private static void copyFileUsingFileStreams(File source, File dest)         throws IOException {         InputStream input = null;         

(转) java 复制文件,不使用输出流复制,高效率,文件通道的方式复制文件

public static void fileChannelCopy(File s, File t) { FileInputStream fi = null; FileOutputStream fo = null; FileChannel in = null; FileChannel out = null; try { fi = new FileInputStream(s); fo = new FileOutputStream(t); in = fi.getChannel();// 得到对应的文