# 文件拷贝
方法:对源文件的目录进行遍历,对目标文件指定的相对路径下进行创建。
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
public class FileCopy { | |
public static void main(String[] args) { | |
// 源路径 | |
String sourcePath = "D:\\sourceFile"; | |
// 目标路径 | |
String targetPath = "D:\\targetFile"; | |
File sourceFile = new File(sourcePath); | |
File targetFile = new File(targetPath); | |
// 拷贝 | |
copy(sourceFile, targetFile); | |
} | |
private static void copy(File sourceFile, File targetFile) { | |
// 如果是文件,则进行拷贝 | |
if (sourceFile.isFile()){ | |
copyFile(sourceFile, targetFile); | |
return; | |
} | |
// 如果是目录,遍历目录 | |
File[] files = sourceFile.listFiles(); | |
for (File file : files){ | |
File newFile = targetFile; | |
// 如果文件是目录的话 | |
if (file.isDirectory()){ | |
// 新建对应目录 | |
String folderName = file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf("\\") + 1); | |
String newPath = targetFile.getAbsolutePath() + "\\" + folderName; | |
// 目录文件目录 | |
newFile = new File(newPath); | |
// 如果不存在,则新建目录 | |
if (!newFile.exists()){ | |
newFile.mkdirs(); | |
} | |
} | |
// 拷贝 | |
copy(file, newFile); | |
} | |
} | |
private static void copyFile(File sourceFile, File targetFile) { | |
// 输入输出流 | |
FileInputStream inputStream = null; | |
FileOutputStream outputStream = null; | |
try { | |
// 文件流 | |
inputStream = new FileInputStream(sourceFile); | |
// 文件名称 | |
String fileName = sourceFile.getAbsolutePath().substring(sourceFile.getAbsolutePath().lastIndexOf("\\") + 1); | |
String targetFilePath = targetFile.getAbsolutePath() + "\\" + fileName; | |
// 输出 | |
outputStream = new FileOutputStream(targetFilePath); | |
// 每次赋值 1Mb | |
byte[] bytes = new byte[1024 * 1024]; | |
// 边读边写 | |
int count; | |
while ((count = inputStream.read(bytes)) != -1){ | |
outputStream.write(bytes, 0, count); | |
} | |
outputStream.flush(); | |
} catch (Exception e){ | |
e.printStackTrace(); | |
}finally { | |
// 关闭输入输出流 | |
if (inputStream != null){ | |
try { | |
inputStream.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
if (outputStream != null){ | |
try { | |
outputStream.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
} |
还可在拷贝的文件末尾写入自定义内容。
列如,想在每个新拷贝文件中的末尾加入作者名和时间等。
private static void copyFile(File sourceFile, File targetFile) { | |
// 已省略...... | |
// 边读边写 | |
int count; | |
while ((count = inputStream.read(bytes)) != -1){ | |
outputStream.write(bytes, 0, count); | |
} | |
// 可在文件末尾写入自定义内容 | |
writeEnd(sourceFile, outputStream); | |
outputStream.flush(); | |
// 已省略...... | |
} | |
private static void writeEnd(File sourceFile, FileOutputStream outputStream) throws IOException { | |
// 作者名 | |
String author = "qiyin"; | |
// 获取文件的创建时间(参考下一章内容) | |
LocalDateTime createTime = FileDate.getFileCreateTime(sourceFile); | |
// 写入的内容 | |
String content = "\n作者: " + author + "\n创建时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd").format(createTime); | |
outputStream.write(content.getBytes()); | |
} |
# 获取文件时间
import java.io.File; | |
import java.io.IOException; | |
import java.nio.file.Files; | |
import java.nio.file.Path; | |
import java.nio.file.attribute.BasicFileAttributes; | |
import java.nio.file.attribute.FileTime; | |
import java.time.LocalDateTime; | |
import java.time.ZoneOffset; | |
public class FileDate { | |
public static void main(String[] args) { | |
// 文件路径 | |
String filePath = "D:\\targetFile\\新建文本文档.txt"; | |
File file = new File(filePath); | |
// 获取文件的创建时间 | |
LocalDateTime fileCreateTime = getFileCreateTime(file); | |
System.out.println(fileCreateTime); | |
} | |
private static LocalDateTime getFileCreateTime(File file) { | |
// 获取文件的 Path | |
Path path = file.toPath(); | |
try { | |
// 根据 Path 获取文件的基本属性 | |
BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class); | |
// 获取文件的创建时间 | |
FileTime fileTime = attributes.creationTime(); | |
// 时间转化 | |
LocalDateTime localDateTime = fileTime.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime(); | |
return localDateTime; | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return LocalDateTime.now(); | |
} | |
} |