使用字符流复制文件

1.在实现使用字符流复制文件的简单功能前,首先说一下关于流(IO),1、根据流的方向可分为输入输出流,对应读写操作;在使用输入流时先要找到源(即就是要读取文件的位置,注意:在找源文件读取时可能发生异常,该文件可能不存在)。2、根据流的单位可把流分为字节流字符流。3、根据流的功能可把流分为节点流处理流

/**
 * 
<p>Title:CopyFile </p>
<p>Description: 采用字节流复制文件</p>
<p>Company: </p>
 * @author 
 * @date 2017-9-22 下午11:18:45
 *
 */
public class copyFile{
	public static void main(String[] args) {
	//复制自己写的Java代码
		copyFile("src/com/ll/io/CopyFile.java","ll1.java");
	}
/**
 * 
* @Title:copyFile
* @Description:文件复制
* @param @param srcFile
* @param @param destFile
* @return void
* @throws IOException
 */
	public static void copy(String srcFile,String destFile){
	//判断源文件或者目标文件是否存在(目标文件可不判断),若文件不存在会报FileNotFoundException
		if(scrFile == null || destFile == null){
			system.out.println("文件不存在!");
			   return;
		}
		//创建相应的管道流,输入输出流,用于读取和写文件操作
		FileReader fr = null;
		FileWriter fw = null;
		try{
			 fr = new FileReader(srcFile);
			 fw = new FileWriter(destFile);
		}catch(IOException e){
		  e.printStackTrace();
		}
		//读写操作
		//创建一个字符缓冲区
		char [] c = new char[1024];
		//记录文件所读的位置,读有多少字符
		int len = 0;
		try{
		    while((len = fr.read(c))!= -1){
			//读的同时进行写
			fw.write(c,0,len);
		    }
		}catch (IOException e) {
			e.printStackTrace();
		}
		//关闭相应资源,一般从后往前关,但在关之前先要做个判断,不然可能会发生空指针异常
		if(fw != null){
		try {
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if(fr != null){
			try {
				fr.close();
			} catch (IOException e) {
				e.printStackTrace();
		}
	  }
	}
}

//Java7开始,可以使用创建对象的类实现java.lang.AutoCloseable接口,这样就可以不必手动去关闭资源,该类会自动关闭相关资源。
 本文如有不当或可改进之处请各位积极指出,谢谢!![这是使用字符流实现的文件复制部分图,因为本文不是复制myeclipse中的代码,纯手写,注释多些,所以看到的图与本文的注释不一样](https://img-blog.csdn.net/20170923162830381?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW5zaXN0bGw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
 

2.使用java.nio包下的通道进行数据传输,这里实现文件复制,具体代码如下:

package com.ll.nio;

import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

import org.junit.Test;

/**
 * 
* @ClassName: TestTransferChannel 
* @Description: 使用通道进行数据的传输(文件复制)
* @author ll
* @date 2018年11月7日 下午5:43:03 
*
 */
 	public class TestTransferChannel{
		@Test
		public void test(){
			long start = System.currentTimeMillis();
			FileChannel  inChannel = null;
			FileChannel outChannel = null;
			try{
				//文件通道,读取的文件地址
				inChannel = FileChannel.open(Paths.get("D:/video/nio/nio/Java NIO.pdf"),StandardOpenOption.READ);
				//保存文件的地址
				outChannel = FlieChannel.open(Paths.get("D:/video/nio/nio/Java NIO11.pdf"),StandardOpenOption.READ, StandardOpenOption.WRITE,StandardOpenOption.CREATE);
				//这里可以使用两种方式写,文件传输,注意使用transferFrom或transferTo对应的通道
			//1.inChannel.transferTo(0,inChannel.size(),outChannel);
			//或者使用以下方式
				outChannel.transferFrom(inChannel,0,inChannel.size());
			}catch(Exception e){
				e.printStackTrace();
			}finally{
			if (outChannel != null) {
				try {
					outChannel.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (inChannel != null) {
				try {
					inChannel.close();		
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
			long end = System.currentTimeMillis();
			System.out.println("消耗的时间为:" + (end - start));
		}
}

运行结果如下

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值