在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理。

需求分析:

·需要实现文件的拷贝操作,那么这种拷贝就有可能拷贝各种类型的文件,所以肯定使用字节流;

·在进行拷贝的时候有可能需要考虑到大文件的拷贝问题;

实现方案:

·方案一:使用InputStream将全部要拷贝的内容直接读取到程序里面,而后一次性的输出到目标文件;

  |- 如果现在拷贝的文件很大,基本上程序就死了;

·方案二:采用部分拷贝,读取一部分输出一部分数据,如果现在要采用第二种做法,核心的操作方法:

|- InputStream:public int read​(byte[] b) throws IOException;

|- OutputStream:public void write​(byte[] b,int off, int len) throws IOException;

范例:实现文件拷贝处理

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
class FileUtil { // 定义一个文件操作的工具类
private File srcFile ; // 源文件路径
private File desFile ; // 目标文件路径
public FileUtil(String src,String des) {
this(new File(src),new File(des)) ;
}
public FileUtil(File srcFile,File desFile) {
this.srcFile = srcFile ;
this.desFile = desFile ;
}
public boolean copy() throws Exception { // 文件拷贝处理
if (!this.srcFile.exists()) { // 源文件必须存在!
System.out.println("拷贝的源文件不存在!");
return false ; // 拷贝失败
}
if (!this.desFile.getParentFile().exists()) {
this.desFile.getParentFile().mkdirs() ; // 创建父目录
}
byte data [] = new byte[1024] ; // 开辟一个拷贝的缓冲区
InputStream input = null ;
OutputStream output = null ;
try {
input = new FileInputStream(this.srcFile) ;
output = new FileOutputStream(this.desFile) ;
int len = 0 ;
// 1、读取数据到数组之中,随后返回读取的个数、len = input.read(data
// 2、判断个数是否是-1,如果不是则进行写入、(len = input.read(data)) != -1
while ((len = input.read(data)) != -1) {
output.write(data, 0, len);
}
return true ;
} catch (Exception e) {
throw e ;
} finally {
if (input != null) {
input.close();
}
if (output != null) {
output.close() ;
}
}
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
if (args.length != 2) { // 程序执行出错
System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径");
System.exit(1);
}
long start = System.currentTimeMillis() ;
FileUtil fu = new FileUtil(args[0],args[1]) ;
System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!");
long end = System.currentTimeMillis() ;
System.out.println("拷贝完成的时间:" + (end - start));
}
}

JavaAPIDemo

但是需要注意的是,以上的做法是属于文件拷贝的最原始的实现,而从JDK1.9开始InputStream和Reader类中都追加有数据转存的处理操作方法:

·InputStream:public long transferTo​(OutputStream out) throws IOException;

·Reader:public long transferTo​(Writer out) throws IOException;

范例:使用转存的方式处理

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
class FileUtil { // 定义一个文件操作的工具类
private File srcFile ; // 源文件路径
private File desFile ; // 目标文件路径
public FileUtil(String src,String des) {
this(new File(src),new File(des)) ;
}
public FileUtil(File srcFile,File desFile) {
this.srcFile = srcFile ;
this.desFile = desFile ;
}
public boolean copy() throws Exception { // 文件拷贝处理
if (!this.srcFile.exists()) { // 源文件必须存在!
System.out.println("拷贝的源文件不存在!");
return false ; // 拷贝失败
}
if (!this.desFile.getParentFile().exists()) {
this.desFile.getParentFile().mkdirs() ; // 创建父目录
}
InputStream input = null ;
OutputStream output = null ;
try {
input = new FileInputStream(this.srcFile) ;
output = new FileOutputStream(this.desFile) ;
input.transferTo(output) ;
return true ;
} catch (Exception e) {
throw e ;
} finally {
if (input != null) {
input.close();
}
if (output != null) {
output.close() ;
}
}
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
if (args.length != 2) { // 程序执行出错
System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径");
System.exit(1);
}
long start = System.currentTimeMillis() ;
FileUtil fu = new FileUtil(args[0],args[1]) ;
System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!");
long end = System.currentTimeMillis() ;
System.out.println("拷贝完成的时间:" + (end - start));
}
}

JavaAPIDemo

此时千万要注意程序的运行版本问题。如果说现在对此程序要求进一步扩展,可以实现一个文件目录的拷贝呢?一旦进行了文件目录的拷贝还需要拷贝所有的子目录中的文件。


范例:文件夹拷贝

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
class FileUtil { // 定义一个文件操作的工具类
private File srcFile ; // 源文件路径
private File desFile ; // 目标文件路径
public FileUtil(String src,String des) {
this(new File(src),new File(des)) ;
}
public FileUtil(File srcFile,File desFile) {
this.srcFile = srcFile ;
this.desFile = desFile ;
}
public boolean copyDir() throws Exception {
try {
this.copyImpl(this.srcFile) ;
return true ;
} catch (Exception e) {
return false ;
}
}
private void copyImpl(File file) throws Exception { // 递归操作
if (file.isDirectory()) { // 是目录
File results [] = file.listFiles() ; // 列出全部目录组成
if (results != null) {
for (int x = 0 ; x < results.length ; x ++) {
copyImpl(results[x]) ;
}
}
} else { // 是文件
String newFilePath = file.getPath().replace(this.srcFile.getPath() + File.separator, "") ;
File newFile = new File(this.desFile,newFilePath) ; // 拷贝的目标路径
this.copyFileImpl(file, newFile) ;
}
}
private boolean copyFileImpl(File srcFile,File desFile) throws Exception {
if (!desFile.getParentFile().exists()) {
desFile.getParentFile().mkdirs() ; // 创建父目录
}
InputStream input = null ;
OutputStream output = null ;
try {
input = new FileInputStream(srcFile) ;
output = new FileOutputStream(desFile) ;
input.transferTo(output) ;
return true ;
} catch (Exception e) {
throw e ;
} finally {
if (input != null) {
input.close();
}
if (output != null) {
output.close() ;
}
}
} public boolean copy() throws Exception { // 文件拷贝处理
if (!this.srcFile.exists()) { // 源文件必须存在!
System.out.println("拷贝的源文件不存在!");
return false ; // 拷贝失败
}
return this.copyFileImpl(this.srcFile, this.desFile) ;
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
if (args.length != 2) { // 程序执行出错
System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径");
System.exit(1);
}
long start = System.currentTimeMillis() ;
FileUtil fu = new FileUtil(args[0],args[1]) ;
if (new File(args[0]).isFile()) { // 文件拷贝
System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!");
} else { // 目录拷贝
System.out.println(fu.copyDir() ? "文件拷贝成功!" : "文件拷贝失败!");
}
long end = System.currentTimeMillis() ;
System.out.println("拷贝完成的时间:" + (end - start));
}
}

JavaAPIDemo

本程序是IO操作的核心代码,本程序可以理解整个的IO处理机制就非常容易理解了。

Java IO编程——文件拷贝的更多相关文章

  1. Java IO 流-- 文件拷贝

    IO流操作套路: 1.创建源: 2.选择流: 3.操作: 4.释放资源 上代码: package com.xzlf.io; import java.io.File; import java.io.Fi ...

  2. java IO流文件拷贝文件(字符流标准写法)

    public static void copyFile2(String path1, String path2) { Reader reader = null; Writer writer = nul ...

  3. java IO Nio 文件拷贝工具类Files

    public static void main(String[] args) throws Exception { Files.copy(Paths.get("file/text.txt&q ...

  4. java IO流文件拷贝文件(字节流标准写法)

    public static void copyFile(String srcPath, String destPath) { FileInputStream fis = null; FileOutpu ...

  5. Java IO编程全解(一)——Java的I/O演进之路

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7419117.html JDK1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O ...

  6. Java IO编程全解(六)——4种I/O的对比与选型

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7804185.html 前面讲到:Java IO编程全解(五)--AIO编程 为了防止由于对一些技术概念和术语 ...

  7. Java IO编程全解(五)——AIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7794151.html 前面讲到:Java IO编程全解(四)--NIO编程 NIO2.0引入了新的异步通道的 ...

  8. Java IO编程全解(四)——NIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这 ...

  9. Java IO :文件

    在java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这里只提供一些必要的知识点. 通过Java IO读文件 如果你需要在不同端之间读 ...

随机推荐

  1. C语言复习————基本数据类型、运算符和表达式

    数据类型/运算符/表达式 主要分两部分介绍,第一部分介绍常用的数据类型,例如:常量和变量/整型/实型/字符型:第二部分介绍算数运算符和算数表达式以及赋值运算符和逗号运算符. 一. 常用的数据类型 1. ...

  2. Android自动跳过app开屏广告

    跳过开屏广告,体验流畅人生 开屏广告 是应用启动时显示的广告,一般右下角(或右下角)有倒计时跳过,不主动点击就会 等待3到5秒 后再进入App 自动跳过 是跳过应用的开屏广告的App 一图胜千文,来我 ...

  3. MongoDB 学习笔记之 检测存储引擎

    检测存储引擎: db.serverStatus().storageEngine db.serverStatus().wiredTiger (转)WiredTiger测试结果 单纯写的测试结果 结论:W ...

  4. 使用echarts画一个类似组织结构图的图表

    昨天,写了一篇关于圆环进度条的博客(请移步:Vue/React圆环进度条),已经烦不胜烦,今天又遇到了需要展示类似公司的组织结构图的功能需求,要冒了!!! 这种需求,自己用div+css也是可以实现的 ...

  5. Delphi Tips

    Delphi Tips 函数篇 语法篇 函数篇 StrToDate() function StrToDate(const S: string): TDateTime; function StrToDa ...

  6. nrm的安装与使用

    nrm的作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址:,我们依旧使用的事npm的命令,只是镜像地址变了 什么是镜像:原来包刚一开始是只存在于国外的NPM服务器, ...

  7. bugku web8

    打开网站,是一段PHP代码, <?php extract($_GET); if (!empty($ac)) { $f = trim(file_get_contents($fn)); if ($a ...

  8. Kubernetes网络分析之Flannel

    Flannel是cereos开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包.传输以及拆包的示意图,从这个图片中可以看出两台机器的docker0分别处于不同的段:10.1.20.1 ...

  9. django2.0+连接mysql数据库迁移时候报错

    django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...

  10. (未完)经典Web漏洞实战演练靶场笔记

    记录下自己写的经典Web漏洞靶场的write up,包括了大部分的经典Web漏洞实战场景,做个笔记. 0x01 任意文件下载漏洞 if(!empty($_GET['filename'])){ $fil ...