FileCopyWithInputStreamDemo.java
package com.example.demo.java.filecopy;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
@Slf4j
public class FileCopyWithInputStreamDemo {
public static void main(String[] args) {
File source = new File("C:\\UserFile\\Foo.java");
File dest = new File("C:\\UserFile\\Foo2.java");
try {
copyFileByStream(source,dest);
} catch (IOException e) {
log.warn("copy 失败------");
e.printStackTrace();
}
}
public static void copyFileByStream(File source, File dest) throws IOException {
try (InputStream is = new FileInputStream(source);
OutputStream os = new FileOutputStream(dest);){
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
}
}
}
FileCopyWithChannelDemo.java
package com.example.demo.java.filecopy;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.channels.FileChannel;
@Slf4j
public class FileCopyWithChannelDemo {
public static void main(String[] args) {
File source = new File("C:\\UserFile\\Foo.java");
File dest = new File("C:\\UserFile\\Foo3.java");
try {
copyFileByChannel(source,dest);
} catch (IOException e) {
log.warn("copy 失败------");
e.printStackTrace();
}
}
public static void copyFileByChannel(File source, File dest) throws IOException {
try (FileChannel sourceChannel = new FileInputStream(source).getChannel();
FileChannel targetChannel = new FileOutputStream(dest).getChannel ();){
for (long count = sourceChannel.size() ;count>0 ;) {
long transferred = sourceChannel.transferTo( sourceChannel.position(), count, targetChannel);
sourceChannel.position(sourceChannel.position() + transferred);
count -= transferred;
}
}
}
}
第三种方式利用自带Files.copy()方法
package com.example.demo.java.filecopy;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.file.Files;
@Slf4j
public class FilesCopyDemo {
public static void main(String[] args) {
File source = new File("C:\\UserFile\\Foo.java");
File dest = new File("C:\\UserFile\\Foo5.java");
try {
Files.copy(source.toPath(),dest.toPath());
} catch (IOException e) {
log.warn("copy 失败------");
e.printStackTrace();
}
}
}
你看第一二种和第三种有什么区别?
可以看到文件属性值不一样,比如创建时间,Files.copy()会copy和源文件一样的文件。
其源码方法是copy(Path source, Path target, CopyOption... options),包含了一个可选参数options,可选属性值有三个。常用的在StandardCopyOption类里REPLACE_EXISTING(允许覆盖)和COPY_ATTRIBUTES(不允许覆盖)
public enum StandardCopyOption implements CopyOption {
/**
* Replace an existing file if it exists.
*/
REPLACE_EXISTING,
/**
* Copy attributes to the new file.
*/
COPY_ATTRIBUTES,
/**
* Move the file as an atomic file system operation.
*/
ATOMIC_MOVE;
}
如果允许覆盖就是
Files.copy(source.toPath(),dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
否则报错FileAlreadyExistsException。