`

文件复制

 
阅读更多

案例运行效果与操作

本案例实现了文件复制功能,并且定义了一个可供其它程序使用的文件复制方法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
分享到:
评论

相关推荐

    文件复制及进度条 android 文件复制 进度条 progressdialog

    在Android开发中,文件复制和进度条的显示是常见的需求,尤其在移动应用中,用户可能需要将数据从一个位置移动到另一个位置,或者在后台下载文件时展示进度。`ProgressDialog`是Android SDK提供的一种对话框组件,...

    java文件复制器代码

    Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...

    文件复制过程显示进度条

    "文件复制过程显示进度条"这个话题就是关于如何提升用户在进行文件操作时的体验,特别是当涉及大文件复制时,进度条能给用户带来可视化的反馈,让用户了解任务的进展情况,从而增加耐心和信任感。在Windows操作系统...

    文件复制算法 文件复制算法

    文件复制算法是计算机科学中一个基础且重要的主题,特别是在数据管理、操作系统以及文件系统领域。在日常操作中,我们经常需要复制文件从一个位置到另一个位置,这背后就涉及到一系列的复制策略和技术。本文将深入...

    操作系统实验报告-文件复制

    操作系统实验报告——文件复制 在计算机科学领域,操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的核心程序,它为用户提供了与计算机交互的接口。在操作系统的学习过程中,进行实验是深入...

    文件复制器程序(VB6.0源代码编写)利用FileCopy函数复制文件‘CommonDialog1.Filter

    在VB6.0编程环境中,开发一个文件复制器程序是一个基础但实用的实践项目。这个程序的核心功能是利用内置的`FileCopy`函数来实现文件的复制操作。下面将详细介绍`FileCopy`函数以及如何在VB6.0中构建这样的程序。 `...

    文件复制、强制替换工具(正在使用的程序也可替换)

    本文将详细讨论“文件复制”和“强制替换工具”,特别是针对那些正在被其他程序使用的文件进行替换的方法。 首先,我们要理解文件复制的基本原理。文件复制是指将一个文件的完整内容复制到另一个位置,保留原有的...

    android 将assets 下的文件复制到手机内存中

    下面将详细解释如何在Android应用中将assets目录下的文件复制到手机内存。 首先,`assets`目录是Android应用中的一个特殊目录,它允许开发者存放非编译型的资源文件,这些文件在应用运行时可以通过AssetManager访问...

    多文件大文件复制源码

    本项目"多文件大文件复制源码"提供了一个使用C#编程语言实现的解决方案,专注于处理大文件以及多个文件的复制,并且在复制过程中加入了进度条显示和速度计算功能,提升了用户体验。 首先,我们来看C#中大文件复制的...

    多文件复制工具 TeraCopy

    标题“多文件复制工具 TeraCopy”揭示了一个高效替代Windows系统默认复制功能的软件,TeraCopy。这款工具专为优化大量文件和大文件的复制过程而设计,解决了用户在复制过程中可能遇到的各种问题,如文件冲突、错误或...

    封装CopyFileEx,实现文件复制异步,控速,获取进度

    标题中的“封装CopyFileEx,实现文件复制异步,控速,获取进度”是指通过编程技术将Windows API中的CopyFileEx函数进行包装,以便在执行文件复制操作时添加额外的功能,如异步处理、速度控制以及复制进度的监控。...

    大文件复制助手

    "大文件复制助手"是一款高效工具,专为解决大文件快速复制的问题。它能在短短的21秒内完成424MB文件的拷贝,极大地提高了工作效率,避免了传统复制方法可能遇到的长时间等待和卡顿。 首先,我们要理解为何大文件...

    Windows可靠文件复制处理

    在Windows操作系统中,进行可靠的文件复制处理是一项至关重要的任务,特别是在需要备份数据或者将大量文件迁移到其他位置时。为了确保文件的安全性和完整性,我们需要采用高效且稳定的复制方法。本篇将详细介绍...

    查找文件 复制文件

    在C#编程中,查找和复制文件是常见的文件操作任务,尤其在开发系统工具或进行数据迁移时。本文将深入探讨如何使用C#实现这两个功能,并提供相关代码示例。 一、查找文件 在C#中,我们可以使用`System.IO`命名空间...

    C#自己自学的文件复制程序带进度条

    【标题】"C#自己自学的文件复制程序带进度条" 涉及的知识点主要集中在C#编程语言的应用上,特别是文件操作和用户界面(UI)设计。在这个项目中,开发者创建了一个能够进行文件复制并同时显示进度条的程序。下面将...

    Hook技术监控文件复制

    【Hook技术监控文件复制】 Hook技术是Windows操作系统中一种强大的机制,它允许程序拦截和处理特定的系统事件或用户输入,而这些事件原本会被其他程序处理。在本场景中,我们关注的是如何利用Hook来监控文件复制...

    文件复制(java代码实现)

    在Java编程语言中,文件复制是一项常见的任务,用于在不同位置之间移动或备份数据。本文将详细介绍如何在Java中实现文件复制,同时考虑到输入输出异常处理,并在DOS控制台环境中运行程序。 首先,我们需要创建一个...

    远程或本地文件复制

    ### 远程或本地文件复制知识点解析 #### 一、概述 本文将详细介绍一个使用C#编写的程序,该程序能够实现远程或本地文件的复制功能。通过简单的配置即可完成文件或目录的复制操作,非常适用于需要频繁进行数据同步的...

    VB 带进度条的文件复制

    在VB(Visual Basic)编程中,创建一个带进度条的文件复制功能是一项常见的需求,它能够为用户在执行长时间操作时提供可视化的进度反馈。在本文中,我们将深入探讨如何利用VB实现这一功能。 首先,我们需要理解VB中...

    java_文件复制(带有编码类型)

    "Java 文件复制(带有编码类型)" 在 Java 中,文件复制是非常常见的操作。今天,我们将讨论如何使用 Java 将文件从一个位置复制到另一个位置,并且带有编码类型。 标题:Java 文件复制(带有编码类型) 描述:...

Global site tag (gtag.js) - Google Analytics