`

文件复制

 
阅读更多

案例运行效果与操作

本案例实现了文件复制功能,并且定义了一个可供其它程序使用的文件复制方法copy-File().

如果目标文件存在,首先要确定它是可写的文件,并且在写入前询问用户。

如果目标是一个目录,则将源文件名作为目标文件名。

制作要点

1 file类的使用

2 FileInputStream()输入流方法的使用

3 FileOutputStrem()输出流方法的使用

步骤详解

1 利用File类查看文件属性

在复制文件之前,需要用File类进行一些测试,读取文件的各种属性,以确定一切正常。

首先定义两个文件,它们都是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());

2 应用FileInputStream()输入流方法和FileOutputStream()输出流方法,进行文件复制。

在JDK1.0中,通常是用InputStream & OutputStream这两个基类来进行读写操作的。

InputStream中的FileInputSream类似一个文件句柄,通过它来对文件进行操作,类似的,

在OutputStream中有FileOutputStream这个对象。这二者可以对文本谁的或二进制文件进行操作。

开始复制文件

resource=new FileInputStream(resourceFile);//创建输入流

target=new FileOutputStream(targetFile);//创建输出流

byte[] buffer=new byte[4096];   //每次读取4k字符

将一段字节流读到缓存中,然后将它们写出来:

while((byteNum=resource.read(buffer))!=-1)//读到文件末尾

target.write(buffer,0,byteNum);//写入

 

/*
 * 本案例能独立实现复制文件
 * 并且定义了一个可供其它程序使用的文件复制方法copyFile()
 */
import java.io.*;

public class FileCopy
{
	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.println("是否覆盖现在的文件:"+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];//每次读取4k字符
				int byteNum;//缓存中的字节数目
				//将一段字节流读到缓存中,然后将它们写出来
				//循环直到文件末尾(当read()返回-1时)停止
				while((byteNum=resource.read(buffer))!=-1)
					//读取流直到文件末尾
					target.write(buffer,0,byteNum);//写入
				System.out.println("文件复制成功!");
			} catch (Exception e)
			{
				e.printStackTrace();
			}finally
			{
				//关闭流
				if(resource!=null)
					try
					{
						resource.close();
					} catch (IOException e2)
					{
						e2.printStackTrace();
					}
				if(target!=null)
					try
					{
						target.close();
					} catch (Exception e2)
					{
						e2.printStackTrace();
					}
			}
	}
	
	public static void abort(String msg) throws IOException
	{
		throw new IOException("文件复制:"+msg);
	}
}
 
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics