Java 实现文件复制的不同方法

 用不同的方法实现文件的复制

1. 通道

Channel,它是一个对象,可以通过它读取和写入数据。拿NIO与原来的I/O比较,通道就像是流。是对接操作系统底层和缓冲区的桥梁。

2. 性能比较

内存映射最快,其次是NIO读写文件,再其次是加了缓冲的IO流,最后是无缓冲的IO流

代码示例

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

public class ChannelDemo {

    public static void main(String[] args) {
        copyFile();
        randomAccessFileCopy();
    }

    /**
     * 使用内存映射实现文件的复制
     */
    private static void randomAccessFileCopy() {
        try {
            RandomAccessFile in = new RandomAccessFile("F:/test.txt", "r");
            RandomAccessFile out = new RandomAccessFile("F:/testbak2.txt", "rw");

            FileChannel fcIn = in.getChannel();
            FileChannel fcOut = out.getChannel();

            long size = fcIn.size();//输入流的字节大小

            // 将输入流映射到缓冲区
            MappedByteBuffer inBuf = fcIn.map(MapMode.READ_ONLY, 0, size);
            MappedByteBuffer outBuf = fcOut.map(MapMode.READ_WRITE, 0, size);

            // 将输入流缓冲区的内容写到输出流缓冲区
            for(int i = 0; i < size; i++) {
                outBuf.put(inBuf.get());
            }

            // 关闭(关闭通道时会写入)
            fcIn.close();
            fcOut.close();
            in.close();
            out.close();
            System.out.println("复制成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }// randomAccessFileCopy

    /**
     * 通过文件通道实现文件复制
     */
    private static void copyFile() {
        try {
            // 创建一个输入文件通道
            FileChannel fcIn = new FileInputStream("F:/test.txt").getChannel();
            // 创建一个输出文件通道
            FileChannel fcOut = new FileOutputStream("F:/testbak.txt").getChannel();

             ByteBuffer buf = ByteBuffer.allocate(1024);
             while(fcIn.read(buf) != -1) {
                 buf.flip();
                 fcOut.write(buf);
                 buf.clear();// 清空缓冲区
             }

             fcOut.close();
             fcIn.close();
             System.out.println("复制成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }// copyFile

}

原文地址:https://www.cnblogs.com/zxfei/p/10893467.html

时间: 2024-08-29 23:59:41

Java 实现文件复制的不同方法的相关文章

JAVA之文件复制 图片下载

用java打造属于自己的爬虫 网络上的图片太多 一个一个的保存实在太浪费时间 基于此 就使用了java做了一个小工具 功能是文件的复制 以及 网络上图片的下载 首先是IOUtlis类的创建 package hh; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputS

Java实现文件复制的四种方式

背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操作 1 private static void streamCopyFile(File srcFile, File desFile) throws IOException { 2 // 使用字节流进行文件复制 3 FileInputStream fi = new FileInputStream(sr

java中文件复制的4种方式

今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一些无效空间.我也是很少用这种方式拷贝问价,大多数用Apache提供的commons-io中的FileUtils,后来在网上查了下,发现还有其他的方式,效率更高,所以在此整理一下,也是自己的一个学习. 1. 使用FileStreams复制 比较经典的一个代码,使用FileInputStream读取文件

java多种文件复制方式以及效率比较

1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream 传统的字符流读写复制FileReader,FileWriter,BufferWriter,BufferedWriter,BufferedReader NIO系列的FileChannel FileChannel+缓冲 java.nio.Files.copy() 第三方包中的Fi

Java字节流文件复制

1.字节流 在 Java 中,文件的复制使用字节输入流和字节输出流实现,java.io 包有 InputStream 和 OutputStream 这两个顶层抽象类规范了读写文件所需的核心 API. 我们可以使用它们的子类 FileInputStream 和 FileOutputStream 来编写程序复制文件. 第一种方式: 使用 read() 和 write() 方法配合循环操作单字节的读取.写入 InputStream 的 read() 会尝试从文件读取一个字节,如果到了文件结尾则会返回-

【java】文件复制的简单实现

1 package 文件操作; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 10 public class TestCopy { 11 public static voi

Java实现文件复制

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * <p>CopyFile.java</p> * <p>Created on Apr 17, 2009, 4:33:43 PM</p> * <p>Copyright (c) 2007-2009. CUCKOO Workgroup, USTC, P.R.Ch

java 高效率文件复制

1 File sourFile = new File(start); //来源文件 2 File tarFile = new File(end); 4 if(!tarFile.exists()){ 5 tarFile.mkdirs(); 6 }10 if(!sourFile.exists()){ 11 System.out.println("跳出本次循环"+start); 12 continue; 13 } 16 FileInputStream fis = null; 17 FileO

Java处理 文件复制

try { InputStream in = new FileInputStream(new File(oldPath)); OutputStream out = new FileOutputStream(new File(newPath )); byte[] be = new byte[100]; while (in.read(be) != -1) { out.write(be); } in.close(); out.flush(); out.close(); } catch (Excepti