⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filecopy.java

📁 JAVA案例开发集锦源代码 袁然 郑自国编
💻 JAVA
字号:
/**
 * 本案例能独立实现复制文件, 并且定义了一个可供其它程序使用的文件复制方法copyFile()
 **/

import java.io.*;

public class FileCopy {
    //程序的main()方法
    public static void main(String[] args) {
        if (args.length != 2)                                  //检查参数
            System.err.println("使用方法:java FileCopy <源文件名> <目的文件名>");
        else {
            //调用copyFile()方法,实现复制文件,并显示错误信息。
            try {
                copyFile(args[0], args[1]);
            } catch (IOException e) {
                System.err.println(e.getMessage());
            }
        }
    }

    //静态方法copyFile()真正实现文件复制,
    //在复制文件之前,进行一些测试,以确定一切正常。
    public static void copyFile(String resourceFileName, String targetFileName)
            throws IOException {
        //首先定义两个文件,它们都是File类的实例
        File resourceFile = new File (resourceFileName);
        File targetFile= new File (targetFileName);

        //首先确定源文件存在,并且是可读的文件
        if (!resourceFile.exists())
            abort("未发现源文件:" + resourceFileName);
        if (!resourceFile.isFile())
            abort("不能复制目录: " + resourceFileName);
        if (!resourceFile.canRead())
            abort("源文件:" + resourceFileName +"不是可读文件!");

        //如果目标是一个目录,则将源文件名作为目标文件名
        if (targetFile.isDirectory())
            targetFile= new File(targetFile, resourceFile.getName());

        //如果目标文件存在,首先要确定它是可写的文件,
        //并且在写入前询问用户。
        //如果目标文件不存在,那么要确定该目录存在并且是可写的。
        if (targetFile.exists()) {
            if (!targetFile.canWrite())
                abort("目标文件不是可写文件:" + targetFileName);

            //询问用户是否覆盖目标文件
            System.out.print("是否覆盖现在的文件 " + targetFile.getName() + "? (Y/N): ");
            System.out.flush();

            //得到用户的反馈信息
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    System.in));
            String response = in.readLine();

            //检测用户反馈的信息,
            //如果得到的答案是否定的,那么取消复制操作。
            if (!response.equals("Y") && !response.equals("y"))
                abort("用户取消复制操作。");
        } else {

            //如果文件不存在,检查目录是否存在,该目录是否是可写的。
            //如果getParent()方法返回空值,说明该目录为当前目录
            String parent = targetFile.getParent(); //目标目录
            if (parent == null) //如果是空值,使用当前目录
                parent = System.getProperty("user.dir");
            File directory = new File(parent); //将它转换成文件
            if (!directory.exists())
                abort("目标目录 " + parent + "不存在。 " );
            if (directory.isFile())
                abort("指定的目标 " + parent + "不是目录 " );
            if (!directory.canWrite())
                abort("指定的目标目录 " + parent + "不是可写的 " );
        }

        //开始复制文件。
        FileInputStream resource = null;   //读取源文件的数据流
        FileOutputStream target = null;    //写入目标文件的数据流
        try {
            resource = new FileInputStream(resourceFile); //创建输入流
            target = new FileOutputStream(targetFile); //创建输出流
            byte[] buffer = new byte[4096];
            int byteNum; //缓存中的字节数目

            //将一段字节流读到缓存中,然后将它们写出来,
            //循环直到文件末尾(当read()返回-1时)停止
            while ((byteNum = resource.read(buffer)) != -1)
                //读取流直到文件末尾
                target.write(buffer, 0, byteNum); //写入
                System.out.print("文件复制成功! ");
        }

        //关闭流
        finally {
            if (resource != null)
                try {
                    resource.close();
                } catch (IOException e) {
                    ;
                }
            if (target != null)
                try {
                    target.close();
                } catch (IOException e) {
                    ;
                }
        }
    }

    //抛出异常
    private static void abort(String msg) throws IOException {
        throw new IOException("文件复制: " + msg);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -