文件拷贝io nio比较

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;

public class FileCopy {
    public static void fileCopyByByte(String inPah, String outPah)
            throws FileNotFoundException, IOException {
        byte[] byteArray = new byte[1024];
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                inPah));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(outPah));
        int readCount = 0;
        while ((readCount = bis.read(byteArray)) != -1) {
            bos.write(byteArray, 0, readCount);
            bos.flush();
        }
        bis.close();
        bos.close();
    }

    public static void fileCopyByChar(String inPah, String outPah)
            throws FileNotFoundException, IOException {
        char[] charArray = new char[1024];
        BufferedReader reader = new BufferedReader(new FileReader(inPah));
        BufferedWriter writer = new BufferedWriter(new FileWriter(outPah));
        int readCount = 0;
        while ((readCount = reader.read(charArray)) != -1) {
            writer.write(charArray, 0, readCount);
            writer.flush();
        }
        reader.close();
        writer.close();
    }

    public static void fileCopyByFileChannel(String inPah,String outPah) throws FileNotFoundException,IOException{
        FileInputStream fis = new FileInputStream(inPah);
        FileOutputStream fos = new FileOutputStream(outPah);
        FileChannel fileChannel_from = fis.getChannel();
        FileChannel fileChannel_to = fos.getChannel();       

        ByteBuffer bytebuffer = ByteBuffer.allocate(1024);
        
        // Read data from file into ByteBuffer
        int bytesCount;
        while ((bytesCount = fileChannel_from.read(bytebuffer)) > 0) {
         //flip the buffer which set the limit to current position, and position to 0             
         bytebuffer.flip();
         //write data from ByteBuffer to file
         fileChannel_to.write(bytebuffer);
         //for the next read
         bytebuffer.clear();
        }
        fileChannel_from.close();
        fileChannel_to.close();
    }
    public static void fileCopyByFileChannelMap(String inPah,String outPah) throws FileNotFoundException,IOException{
        FileInputStream fis = new FileInputStream(inPah);
        FileOutputStream fos = new FileOutputStream(outPah);
        FileChannel fileChannel_from = fis.getChannel();
        FileChannel fileChannel_to = fos.getChannel();       
        
        MappedByteBuffer bytebuffer = fileChannel_from.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel_from.size());
        fileChannel_to.write(bytebuffer);
        bytebuffer.clear();
        fileChannel_from.close();
        fileChannel_to.close();
    }

    public static void main(String[] args) {
        try {
            String in = "E:/小说/左道旁门.txt";
            long begin = System.currentTimeMillis();
            fileCopyByByte(in, "e:/2");
            System.out.println(System.currentTimeMillis() - begin);
            begin = System.currentTimeMillis();
            fileCopyByFileChannel(in, "e:/3");
            System.out.println(System.currentTimeMillis() - begin);
            begin = System.currentTimeMillis();
            fileCopyByFileChannelMap(in, "e:/4");
            System.out.println(System.currentTimeMillis() - begin);
            begin = System.currentTimeMillis();
            Files.copy(new File(in).toPath(), new File("e:/5").toPath());
            System.out.println(System.currentTimeMillis() - begin);
            
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
}

 

十几M小文件

360
843
672
641

100多M文件

19547
5610
2703
8718

300多M文件

41156
13609
8563
9500

1.7G文件

202156
225109

出错,可能超过限制
163719

posted @ 2017-07-22 21:48  tonggc1668  阅读(133)  评论(0编辑  收藏  举报