使用字符流复制文件

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

/**
 * 

Title:CopyFile

Description: 采用字节流复制文件

Company:

* @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));
		}
}

运行结果如下

你可能感兴趣的:(Java基础,IO)