`

java文件复制

阅读更多
java拷贝文件线程
package com.zhao_yi.sysutils.classes.copyfile;

import java.io.*;
import com.zhao_yi.sysutils.SysUtil;
import com.zhao_yi.sysutils.classes.StringList;


public class CopyFileThread extends Thread {

  private long CurCopied = 0;
  private boolean suspendRequested = false;
  private boolean terminateRequested = false;
  private StringList SrcFiles = new StringList();
  private StringList DstFiles = new StringList();
  private CopyFile copyfile = null;
  private String ErrMsg = "";
  public CopyFileThread(CopyFile copyfile) {
    this.copyfile = copyfile;
  }

  public void AddCopyFiles(StringList SrcFiles, StringList DstFiles) {
    this.SrcFiles.AddStrings(SrcFiles);
    this.DstFiles.AddStrings(DstFiles);
  }

  private boolean CopyOneFile(String SrcFile, String DstFile) {
    InputStream in = null;
    OutputStream out = null;
    try {
      in = new FileInputStream(SrcFile);
      out = new FileOutputStream(DstFile);
      byte[] buf = new byte[1024];
      int len = 0;
      while (!interrupted() && !terminateRequested) {
        len = in.read(buf);
        if (len == 0)
          break;
        out.write(buf, 0, len);
        copyfile.OnCopyProcess(len);
      }
    } catch (IOException ex) {
      ErrMsg = "拷贝文件的过程中 出现异常: " + ex.getMessage();
    } finally {
      try {
        in.close();
        out.close();
      } catch (IOException ex) {
        ErrMsg = "拷贝文件的过程中 出现异常: " + ex.getMessage();
      }
      return SysUtil.SameText("", ErrMsg);
    }
  }

  public void run() {
    try {
      copyfile.OnCopyBegin();
      int fileCount = SrcFiles.getCount();

      for (int i = 0; i < fileCount; i++) {
        CheckSuspended();
        if (!interrupted() && !terminateRequested) {
          String SrcFile = SrcFiles.Get(i);
          String DstFile = DstFiles.Get(i);
          if (!
              (SysUtil.ForceDirectories(SysUtil.ExtractFilePath(DstFile)) &&
               CopyOneFile(SrcFile, DstFile))
              )
            break;
        }
      }

    } catch (Exception ex) {
      ErrMsg = ex.getMessage();

    } finally {
      copyfile.OnCopyEnd(ErrMsg);
    }

  }

  public synchronized void RequestSuspend() {
    suspendRequested = false;
  }

  public synchronized void RequestResume() {
    suspendRequested = false;
    notify();
  }

  public synchronized void RequestTerminate() {
    terminateRequested = true;
    if (suspendRequested)
      RequestResume();
  }

  public synchronized void CheckSuspended() {
    while (suspendRequested && !interrupted()) {
      try {
        wait();
      } catch (InterruptedException ex) {
        ErrMsg = "暂停的过程中 被强行停止: " + ex.getMessage();
      }
    }

  }


}


Java复制文件速度最快的算法
第一种方法,是采用普通的IO,Buffered流,速度一般;另一种是采用Channel流的transfer方法,速度超快。建议采用第二种方法。
 public static long copyFile(File srcFile,File destDir,String newFileName){
  long copySizes = 0;
  if(!srcFile.exists()){
   System.out.println("源文件不存在");
   copySizes = -1;
  }
  else if(!destDir.exists()){
   System.out.println("目标目录不存在");
   copySizes = -1;
  }
  else if(newFileName == null){
   System.out.println("文件名为null");
   copySizes = -1;
  }
  else{
   try {
    BufferedInputStream bin = new BufferedInputStream(
      new FileInputStream(srcFile));
    BufferedOutputStream bout = new BufferedOutputStream(
      new FileOutputStream(new File(destDir,newFileName)));
    int b = 0 ,i = 0;
    long t1 = System.currentTimeMillis();
    while((b = bin.read()) != -1){
     bout.write(b);
     i++;
    }
    long t2 = System.currentTimeMillis();
    bout.flush();
    bin.close();
    bout.close();
    copySizes = i;
    long t = t2-t1;
    System.out.println("复制了" + i + "个字节\n" + "时间" + t);
   } catch (FileNotFoundException e) {    
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return copySizes;
 }
 
 public static long copyFile2(File srcFile,File destDir,String newFileName){
  long copySizes = 0;
  if(!srcFile.exists()){
   System.out.println("源文件不存在");
   copySizes = -1;
  }
  else if(!destDir.exists()){
   System.out.println("目标目录不存在");
   copySizes = -1;
  }
  else if(newFileName == null){
   System.out.println("文件名为null");
   copySizes = -1;
  }
  else{
   try {
    FileChannel fcin = new FileInputStream(srcFile).getChannel();
    FileChannel fcout = new FileOutputStream(
          new File(destDir,newFileName)).getChannel();
    ByteBuffer buff = ByteBuffer.allocate(1024);
    int b = 0 ,i = 0;
//    long t1 = System.currentTimeMillis();
    
    long size = fcin.size();
    fcin.transferTo(0,fcin.size(),fcout);
    //fcout.transferFrom(fcin,0,fcin.size());
    //一定要分清哪个文件有数据,那个文件没有数据,数据只能从有数据的流向
    //没有数据的文件
//    long t2 = System.currentTimeMillis();
    fcin.close();
    fcout.close();
    copySizes = size;
//    long t = t2-t1;
//    System.out.println("复制了" + i + "个字节\n" + "时间" + t);
//    System.out.println("复制了" + size + "个字节\n" + "时间" + t);
   } catch (FileNotFoundException e) {    
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return copySizes;
 }


使用nio和io来测试一个100m的文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class CopyFile {
    /**
     * nio拷贝
     * @param inFile  源文件
     * @param outFile 目标文件
     * @return
     * @throws Exception
     */
    public static long FileChannelCopy(String inFile,String outFile) throws Exception
    {
        long begin = System.currentTimeMillis();
        File in = new File(inFile);    
        File out = new File(outFile);
        FileInputStream fin = new FileInputStream(in);
        FileOutputStream fout = new FileOutputStream(out);
        FileChannel inc = fin.getChannel();
        FileChannel outc = fout.getChannel();
        int bufferLen = 2097152;
        ByteBuffer bb = ByteBuffer.allocateDirect(bufferLen);
        while (true)
        {
            int ret = inc.read(bb);
            if (ret == -1)
            {      
                fin.close();
                fout.flush();
                fout.close();
                break;
            }
            bb.flip();
            outc.write(bb);
            bb.clear();
        }
        long end = System.currentTimeMillis();
        long runtime = 0;
        if(end >  begin)
            runtime = end - begin;
        return runtime;

    }
    /**
     * io拷贝
     * @param inFile 源文件
     * @param outFile 目标文件
     * @return
     * @throws Exception
     */
    public static long FileStraeamCopy(String inFile,String outFile) throws Exception
    {
        long begin = System.currentTimeMillis();
        
        File in = new File(inFile);
        File out = new File(outFile);
        FileInputStream fin=new FileInputStream(in);
        FileOutputStream fout=new FileOutputStream(out);
    
        int length=2097152;//2m内存
        byte[] buffer=new byte[length];
        
        while(true)
        {
            int ins=fin.read(buffer);
            if(ins==-1)
            {
                fin.close();
                fout.flush();
                fout.close();
                break;
                
            }else
                fout.write(buffer,0,ins);
            
        }
        long end = System.currentTimeMillis();
        long runtime = 0;
        if(end > begin)
            runtime = end - begin;
        return runtime;

    }
    static public void main(String args[]) throws Exception {
        String inFile = "D:\\big4.pdf"; //源文件
        String outFile = "D:\\big4copy1.pdf"; //输出文件1
        String outFile2 = "D:\\big4copy2.pdf"; //输出文件2
        long runtime1,runtime2;
        runtime1 = FileChannelCopy(inFile,outFile);
        runtime2 = FileStraeamCopy(inFile,outFile2);
        System.out.println("FileChannelCopy running time:" + runtime1);
        System.out.println("FileStraeamCopy running time:" + runtime2);
    }
}


一个简单的方式就是调用cmd命令,使用windows自带的功能来替你完成这个功能
我给你写个例子
import java.io.*;
public class test{
   public static void main(String[] args){
        BufferedReader in = null;
        try{
         // 这里你就当作操作对dos一样好了 不过cmd /c 一定不要动
         Process pro =  Runtime.getRuntime().exec("cmd /c copy d:\\ReadMe.txt e:\\");
         in = new BufferedReader(new InputStreamReader(pro.getInputStream()));
         String str;
         while((str = in.readLine()) != null){
            System.out.println(str);
         }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
           if(in != null){
               try{
                   in.close();
               }catch(IOException i){
                  i.printStackTrace();
               }
           }
        }
   }
} 
分享到:
评论
1 楼 s21109 2012-04-28  
不错 很详细

相关推荐

    java文件复制,实现文件的复制

    ### Java 文件复制技术详解 在Java编程中,文件复制是一项常用且重要的操作。无论是单一文件还是整个文件夹的复制,都是开发过程中常见的需求之一。本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #...

    java文件复制功能

    java文件复制,使用java语言开发的,效果如windows 的复制和粘贴效果。

    java文件复制器代码

    Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...

    java文件复制(全)

    在Java编程中,文件复制是一项基础且常见的任务,无论是在日常开发还是系统集成中都扮演着重要角色。本文将深入探讨如何使用Java实现文件的复制,包括单个文件的复制和整个文件夹及其子文件的复制。 首先,我们来看...

    java复制文件的4种方式

    本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...

    java文件复制器

    一个简单的基于java实现的文件复制器,分享给大家学习

    java_文件复制(带有编码类型)

    "Java 文件复制(带有编码类型)" 在 Java 中,文件复制是非常常见的操作。今天,我们将讨论如何使用 Java 将文件从一个位置复制到另一个位置,并且带有编码类型。 标题:Java 文件复制(带有编码类型) 描述:...

    JAVA文件复制操作

    实现文本复制操作的简易JAVA代码,适用于JAVA初学者

    JAVA文件复制

    这是JAVA SE中的文件复制的代码,很多人对于文件复制不是很理解,希望通过此代码可以帮助更多的人来理解怎么是用Java语言实现文件的复制

    java简单的文件复制粘贴

    Java 文件复制粘贴 Java 文件复制粘贴是指使用 Java 语言实现文件的复制和粘贴操作。在本节中,我们将介绍 Java 文件复制粘贴的实现方法。 文件复制粘贴的重要性 文件复制粘贴是计算机操作系统中的一种基本操作。...

    java文件复制小程序

    用户输入原始文件地址。。。然后输入要复制到的目录。

    Java文件的复制源代码

    在标题和描述中提到的"Java文件复制源代码",主要是指如何使用Java语言来实现文件的拷贝操作。这里我们将深入探讨如何通过Java标准库API来完成文件的复制,并且特别关注使用Swing组件的情况。 首先,我们从最基础的...

    java复制文件代码

    ### 一、Java文件复制的基本原理 在Java中,复制文件通常涉及到读取源文件的内容,并将其写入到目标文件的过程。这个过程可以通过多种方式实现,包括使用`FileInputStream`和`FileOutputStream`、`Files.copy()`...

    文件复制(java代码实现)

    在Java编程语言中,文件复制是一项常见的任务,用于在不同位置之间移动或备份数据。本文将详细介绍如何在Java中实现文件复制,同时考虑到输入输出异常处理,并在DOS控制台环境中运行程序。 首先,我们需要创建一个...

    java 文件复制

    在Java编程中,文件复制是一项基础且常见的任务,它涉及到对磁盘上的文件进行读取、写入等操作。下面将详细讲解如何使用Java进行文件复制,以及涉及的相关知识点。 首先,我们需要导入Java的`java.io`包,这个包...

    File-Operation-by-java.rar_java 文件复制_operation

    这个名为"File-Operation-by-java.rar"的压缩包包含了一个用Java实现的文件操作示例,它演示了如何进行文件复制、移动、删除以及新建等基本操作。让我们详细探讨一下这些功能的实现。 1. **文件复制**: 文件复制...

    java 实现文件复制 源码

    实现简单的文件复制功能,适合java入门学习 输入输出部分

    java 复制文件 io流操作

    在Java编程语言中,文件复制是一项常见的任务,主要通过IO(Input/Output)流来实现。IO流提供了从一个源读取数据并将其写入另一个目的地的机制。在这个主题中,我们将深入探讨如何使用Java的IO流进行文件复制,重点...

Global site tag (gtag.js) - Google Analytics