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