做课后作业的时候有道操作题做文件的复制粘贴,io流的复制粘贴贼拉麻烦,好巧不巧的我比较懒,就百度找个简单的复制粘贴方法,功夫不负有心人,找到了四种,可把我牛逼坏了。这必须写个博客偷偷记下来,以备后用。


 

  先把老师的链接粘贴上。

 

4种java复制文件的方式_java_脚本之家 (jb51.net)

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

  1. 使用FileStreams复制

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
privatestaticvoidcopyFileUsingFileStreams(File source, File dest)
    throwsIOException { 
  InputStream input = null
  OutputStream output = null
  try{
      input = newFileInputStream(source);
      output = newFileOutputStream(dest);   
      byte[] buf = newbyte[1024];   
      intbytesRead;   
      while((bytesRead = input.read(buf)) > 0) {
        output.write(buf, 0, bytesRead);
      }
  } finally{
    input.close();
    output.close();
  }
}

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

  2. 使用FileChannel复制

Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。这是第二种方法的代码:

1
2
3
4
5
6
7
8
9
10
11
12
privatestaticvoidcopyFileUsingFileChannels(File source, File dest) throwsIOException { 
    FileChannel inputChannel = null
    FileChannel outputChannel = null
  try{
    inputChannel = newFileInputStream(source).getChannel();
    outputChannel = newFileOutputStream(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内部。 这是第三种方法的代码:

1
2
3
4
privatestaticvoidcopyFileUsingApacheCommonsIO(File source, File dest)
    throwsIOException {
  FileUtils.copyFile(source, dest);
}

 

  4. 使用Java7的Files类复制

如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:

1
2
3
4
privatestaticvoidcopyFileUsingJava7Files(File source, File dest)
    throwsIOException { 
    Files.copy(source.toPath(), dest.toPath());
}

  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
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.nio.channels.FileChannel;
importjava.nio.file.Files;
importorg.apache.commons.io.FileUtils;
 
publicclassCopyFilesExample {
 
  publicstaticvoidmain(String[] args) throwsInterruptedException,
      IOException {
 
    File source = newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt");
    File dest = newFile("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt");
 
    // copy file using FileStreams
    longstart = System.nanoTime();
    longend;
    copyFileUsingFileStreams(source, dest);
    System.out.println("Time taken by FileStreams Copy = "
        + (System.nanoTime() - start));
 
    // copy files using java.nio.FileChannel
    source = newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt");
    dest = newFile("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 = newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt");
    dest = newFile("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 = newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt");
    dest = newFile("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));
 
  }
 
  privatestaticvoidcopyFileUsingFileStreams(File source, File dest)
      throwsIOException {
    InputStream input = null;
    OutputStream output = null;
    try{
      input = newFileInputStream(source);
      output = newFileOutputStream(dest);
      byte[] buf = newbyte[1024];
      intbytesRead;
      while((bytesRead = input.read(buf)) > 0) {
        output.write(buf, 0, bytesRead);
      }
    } finally{
      input.close();
      output.close();
    }
  }
 
  privatestaticvoidcopyFileUsingFileChannels(File source, File dest)
      throwsIOException {
    FileChannel inputChannel = null;
    FileChannel outputChannel = null;
    try{
      inputChannel = newFileInputStream(source).getChannel();
      outputChannel = newFileOutputStream(dest).getChannel();
      outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    } finally{
      inputChannel.close();
      outputChannel.close();
    }
  }
 
  privatestaticvoidcopyFileUsingJava7Files(File source, File dest)
      throwsIOException {
    Files.copy(source.toPath(), dest.toPath());
  }
 
  privatestaticvoidcopyFileUsingApacheCommonsIO(File source, File dest)
      throwsIOException {
    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中四种不同的方法可以复制一个文件。

以上就是本文的全部内容,希望对大家的学习有所帮助。

 

    一共四种方法,对于我这种初学者来说,还是比较好理解的,作为课后拓展知识储备。后进末学再次鸣谢。