You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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/");
    }
}

代码关键点解释

  1. 目录判断逻辑:在复制前先检查目标路径是否为目录,是的话直接提示退出,避免把文件复制成目录里的同名文件(或者错误操作)
  2. 文件元数据获取:
    • sourceFile.length()拿到的是字节数,通过formatFileSize方法转成易读的单位
    • sourceFile.lastModified()得到的是从1970年开始的毫秒数,用SimpleDateFormat转成常见的日期格式
  3. 流的安全处理:用try-with-resources语法,不需要手动关闭流,Java会自动处理,避免IO资源泄漏
  4. 缓冲区优化:用4KB的缓冲区一次性读取写入,比单字节复制效率高很多

内容的提问来源于stack exchange,提问作者Vlad Paskevits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:20:09