Java 学习笔记 - 复制文件
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - 复制文件相关的知识,希望对你有一定的参考价值。
Java 学习笔记 - 复制文件
二进制方式复制
org.apache.commons.io.FileUtils 工具类
★ 复制单个文件
/**
* 复制文件
* org.apache.commons.io.FileUtils 内部封装 FileChannel 实现。
* 对参数做了相关检查,能自动创建上级目录。默认保持修改日期。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByApacheUtils(File sourceFile, File targetFile)
try
FileUtils.copyFile(sourceFile, targetFile);
catch (IOException e)
e.printStackTrace();
★ 递归复制整个文件夹内容
/**
* 递归复制整个文件夹内容
* org.apache.commons.io.FileUtils 内部封装 FileChannel 实现。
* 对参数做了相关检查,能自动创建上级目录。默认保持修改日期。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void recursionCopyByApacheUtils(File sourceFile, File targetFile)
try
FileUtils.copyDirectory(sourceFile, targetFile);
catch (IOException e)
e.printStackTrace();
FileInputStream、FileOutputStream 实现
/**
* 复制文件
* InputStream、OutputStream 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByFileStreams(File sourceFile, File targetFile)
try (InputStream input = new FileInputStream(sourceFile);
OutputStream output = new FileOutputStream(targetFile)
)
byte[] buf = new byte[1024];
int len;
while ((len = input.read(buf)) != -1)
output.write(buf, 0, len);
catch (IOException e)
e.printStackTrace();
BufferedInputStream、BufferedOutputStream 实现
/**
* 复制文件
* BufferedInputStream、BufferedOutputStream 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByBufferediostream(File sourceFile, File targetFile)
try (BufferedInputStream input = new BufferedInputStream(new FileInputStream(sourceFile));
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(targetFile))
)
byte[] buf = new byte[1024];
int len;
while ((len = input.read(buf)) != -1)
output.write(buf, 0, len);
catch (IOException e)
e.printStackTrace();
FileChannel 实现
/**
* 复制文件
* FileChannel 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByFileChannel(File sourceFile, File targetFile)
try (FileChannel inputChannel = new FileInputStream(sourceFile).getChannel();
FileChannel outputChannel = new FileOutputStream(targetFile).getChannel()
)
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
catch (IOException e)
e.printStackTrace();
Java7 的 Files.copy 实现
/**
* 复制文件
* java7 的 Files.copy 实现。未对参数做任何检测,建议。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByFilesCopy(File sourceFile, File targetFile)
try
Files.copy(sourceFile.toPath(), targetFile.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
catch (IOException e)
e.printStackTrace();
Java7 的 Files.walkFileTree + FileVisitor 实现递归复制
/**
* 递归复制整个文件夹内容
* java7 的 Files.walkFileTree + FileVisitor 实现。
* @param sourcePath 源路径
* @param targetPath 目标路径
*/
private static void recursionCopyByFilesWalkFileTree(Path sourcePath, Path targetPath)
try
Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>()
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
System.out.println("处理文件夹: " + dir);
Path path = targetPath.resolve(sourcePath.relativize(dir));
if (!path.toFile().exists())
Files.createDirectory(path);
return FileVisitResult.CONTINUE;
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
System.out.println("复制文件: " + file);
Path path = targetPath.resolve(sourcePath.relativize(file));
Files.copy(file, path, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
);
catch (IOException e)
e.printStackTrace();
递归复制整个文件夹内容
这里主要是参数判断和递归的逻辑,Files.copy
负责拷贝单个文件,可以换别的方式实现。
/**
* 递归复制整个文件夹内容
* java7 的 Files.copy 实现。
* @param sourceFile 源路径
* @param targetFile 目标路径
*/
static void copyDirectory(File sourceFile, File targetFile) throws IOException
if (sourceFile.isDirectory() == false)
throw new IOException("不是有效路径: " + sourceFile.getAbsolutePath());
if (targetFile.mkdirs() == false && targetFile.isDirectory() == false)
throw new IOException("路径创建失败: " + targetFile.getAbsolutePath());
File[] files = sourceFile.listFiles();
if (files != null)
for (File file: files)
File tempFile = new File(targetFile.getAbsoluteFile(), file.getName());
if (file.isDirectory())
tempFile.mkdirs();
copyDirectory(file,tempFile); // 如果是文件夹递归调用
else
// java7 的 Files.copy
Files.copy(file.toPath(), tempFile.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
字符文件复制
FileReader、FileWriter 实现
/**
* 复制文本文件
* FileReader、FileWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByFileReader(File sourceFile, File targetFile)
try (FileReader input = new FileReader(sourceFile);
FileWriter output = new FileWriter(targetFile)
)
int data;
while ((data = input.read()) != -1)
System.out.println(String.valueOf((char)data));
output.write(data);
catch (IOException e)
e.printStackTrace();
BufferedReader、BufferedWriter 实现
/**
* 复制文本文件
* BufferedReader、BufferedWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByBufferedFileReader(File sourceFile, File targetFile)
try (BufferedReader input = new BufferedReader(new FileReader(sourceFile));
BufferedWriter output = new BufferedWriter(new FileWriter(targetFile))
)
char[] buf = new char[1024];
int len = 0;
while ((len = input.read(buf)) != -1)
System.out.println(String.valueOf(buf));
System.out.println("----------------------------------------------");
output.write(buf, 0, len);
catch (IOException e)
e.printStackTrace();
BufferedReader、BufferedWriter 实现逐行复制
/**
* 【逐行】复制文本文件
* BufferedReader、BufferedWriter 实现。未做任何检测,参数不对或IO读写失败都会翻车。
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private static void copyByBufferedFileReaderByLine(File sourceFile, File targetFile)
try (BufferedReader input = new BufferedReader(new FileReader(sourceFile));
BufferedWriter output = new BufferedWriter(new FileWriter(targetFile))
)
String strLine = null;
int lineNumber = 0;
while ((strLine = input.readLine()) != null)
System.out.println(++lineNumber + ". " + strLine);
output.write(strLine);
output.newLine();
catch (IOException e)
e.printStackTrace();
参考资料
Copying a File or Directory (The Java™ Tutorials)
org.apache.commons.io.FileUtils 工具类
以上是关于Java 学习笔记 - 复制文件的主要内容,如果未能解决你的问题,请参考以下文章