基于InputStream/OutputStream实现复制:目录拦截与文件属性获取求助
文件复制实现:处理目录判断、文件大小与修改时间展示
嘿,我来帮你搞定这个文件复制的需求,特别是你困惑的获取文件大小和最后修改时间的部分,还有复制到目录时的终止逻辑,咱们一步步来:
核心知识点梳理
要实现需求里的功能,主要依赖Java的File类来获取文件元数据,结合IO流完成复制:
- 判断目标是否为目录:用
File.isDirectory()方法,一旦判定是目录,直接打印提示并终止程序 - 获取文件大小:
File.length()返回文件的字节数,你可以转成KB/MB让输出更友好 - 获取最后修改时间:
File.lastModified()返回毫秒级时间戳,用日期格式化工具转成可读的时间字符串
完整实现代码
import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; public class KopeeriFail { private static void kopeeri(String startPath, String targetPath) { File sourceFile = new File(startPath); File targetFile = new File(targetPath); // 先判断源文件是否存在 if (!sourceFile.exists()) { System.out.println("错误:源文件不存在!"); return; } // 判断目标是否为目录,如果是则提示并终止 if (targetFile.isDirectory()) { System.out.println("提示:目标是目录,无法完成复制,程序终止。"); return; } // 获取并展示源文件信息 long fileSize = sourceFile.length(); long lastModifiedTime = sourceFile.lastModified(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedTime = dateFormat.format(new Date(lastModifiedTime)); System.out.println("正在复制文件:"); System.out.println("文件大小:" + formatFileSize(fileSize)); System.out.println("最后修改时间:" + formattedTime); // 使用try-with-resources自动关闭流,避免资源泄漏 try (InputStream in = new FileInputStream(sourceFile); OutputStream out = new FileOutputStream(targetFile)) { byte[] buffer = new byte[1024 * 4]; // 4KB缓冲区,提升复制效率 int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } System.out.println("文件复制完成!"); } catch (IOException e) { System.out.println("复制过程中发生错误:" + e.getMessage()); e.printStackTrace(); } } // 辅助方法:把字节数转成更友好的单位(KB/MB) private static String formatFileSize(long bytes) { if (bytes < 1024) { return bytes + " 字节"; } else if (bytes < 1024 * 1024) { return String.format("%.2f KB", bytes / 1024.0); } else { return String.format("%.2f MB", bytes / (1024.0 * 1024)); } } public static void main(String[] args) { // 示例调用,你可以替换成自己的文件路径 kopeeri("source.txt", "target.txt"); // 测试目录目标的情况 // kopeeri("source.txt", "./target_dir/"); } }
代码关键点解释
- 目录判断逻辑:在复制前先检查目标路径是否为目录,是的话直接提示退出,避免把文件复制成目录里的同名文件(或者错误操作)
- 文件元数据获取:
sourceFile.length()拿到的是字节数,通过formatFileSize方法转成易读的单位sourceFile.lastModified()得到的是从1970年开始的毫秒数,用SimpleDateFormat转成常见的日期格式
- 流的安全处理:用
try-with-resources语法,不需要手动关闭流,Java会自动处理,避免IO资源泄漏 - 缓冲区优化:用4KB的缓冲区一次性读取写入,比单字节复制效率高很多
内容的提问来源于stack exchange,提问作者Vlad Paskevits
相关产品推荐
相关产品推荐

