📄 filecopy.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 + -