欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现文件复制上传操作

程序员文章站 2024-03-09 15:11:59
利用java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法: public static boolean copyfile(stri...

利用java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法:

public static boolean copyfile(string srcfilename, string destfilename,boolean overlay); 
public static boolean copydirectory(string srcdirname, string destdirname,boolean overlay) ; 

其中:
srcfilename 待复制的文件名
descfilename  目标文件名
overlay  如果目标文件存在,是否覆盖
如果复制成功返回true,否则返回false

代码:

 import java.io.file; 
import java.io.fileinputstream; 
import java.io.filenotfoundexception; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import java.io.inputstream; 
import java.io.outputstream; 
 
import javax.swing.joptionpane; 
 
/** 
 * 复制文件或文件夹 
 * 
 * zww 
 */ 
public class copyfileutil { 
 
  private static string message = ""; 
 
  /** 
   * 复制单个文件 
   * 
   * @param srcfilename 
   *      待复制的文件名 
   * @param descfilename 
   *      目标文件名 
   * @param overlay 
   *      如果目标文件存在,是否覆盖 
   * @return 如果复制成功返回true,否则返回false 
   */ 
  public static boolean copyfile(string srcfilename, string destfilename, 
      boolean overlay) { 
    file srcfile = new file(srcfilename); 
 
    // 判断源文件是否存在 
    if (!srcfile.exists()) { 
      message = "源文件:" + srcfilename + "不存在!"; 
      joptionpane.showmessagedialog(null, message); 
      return false; 
    } else if (!srcfile.isfile()) { 
      message = "复制文件失败,源文件:" + srcfilename + "不是一个文件!"; 
      joptionpane.showmessagedialog(null, message); 
      return false; 
    } 
 
    // 判断目标文件是否存在 
    file destfile = new file(destfilename); 
    if (destfile.exists()) { 
      // 如果目标文件存在并允许覆盖 
      if (overlay) { 
        // 删除已经存在的目标文件,无论目标文件是目录还是单个文件 
        new file(destfilename).delete(); 
      } 
    } else { 
      // 如果目标文件所在目录不存在,则创建目录 
      if (!destfile.getparentfile().exists()) { 
        // 目标文件所在目录不存在 
        if (!destfile.getparentfile().mkdirs()) { 
          // 复制文件失败:创建目标文件所在目录失败 
          return false; 
        } 
      } 
    } 
 
    // 复制文件 
    int byteread = 0; // 读取的字节数 
    inputstream in = null; 
    outputstream out = null; 
 
    try { 
      in = new fileinputstream(srcfile); 
      out = new fileoutputstream(destfile); 
      byte[] buffer = new byte[1024]; 
 
      while ((byteread = in.read(buffer)) != -1) { 
        out.write(buffer, 0, byteread); 
      } 
      return true; 
    } catch (filenotfoundexception e) { 
      return false; 
    } catch (ioexception e) { 
      return false; 
    } finally { 
      try { 
        if (out != null) 
          out.close(); 
        if (in != null) 
          in.close(); 
      } catch (ioexception e) { 
        e.printstacktrace(); 
      } 
    } 
  } 
 
  /** 
   * 复制整个目录的内容 
   * 
   * @param srcdirname 
   *      待复制目录的目录名 
   * @param destdirname 
   *      目标目录名 
   * @param overlay 
   *      如果目标目录存在,是否覆盖 
   * @return 如果复制成功返回true,否则返回false 
   */ 
  public static boolean copydirectory(string srcdirname, string destdirname, 
      boolean overlay) { 
    // 判断源目录是否存在 
    file srcdir = new file(srcdirname); 
    if (!srcdir.exists()) { 
      message = "复制目录失败:源目录" + srcdirname + "不存在!"; 
      joptionpane.showmessagedialog(null, message); 
      return false; 
    } else if (!srcdir.isdirectory()) { 
      message = "复制目录失败:" + srcdirname + "不是目录!"; 
      joptionpane.showmessagedialog(null, message); 
      return false; 
    } 
 
    // 如果目标目录名不是以文件分隔符结尾,则加上文件分隔符 
    if (!destdirname.endswith(file.separator)) { 
      destdirname = destdirname + file.separator; 
    } 
    file destdir = new file(destdirname); 
    // 如果目标文件夹存在 
    if (destdir.exists()) { 
      // 如果允许覆盖则删除已存在的目标目录 
      if (overlay) { 
        new file(destdirname).delete(); 
      } else { 
        message = "复制目录失败:目的目录" + destdirname + "已存在!"; 
        joptionpane.showmessagedialog(null, message); 
        return false; 
      } 
    } else { 
      // 创建目的目录 
      system.out.println("目的目录不存在,准备创建。。。"); 
      if (!destdir.mkdirs()) { 
        system.out.println("复制目录失败:创建目的目录失败!"); 
        return false; 
      } 
    } 
 
    boolean flag = true; 
    file[] files = srcdir.listfiles(); 
    for (int i = 0; i < files.length; i++) { 
      // 复制文件 
      if (files[i].isfile()) { 
        flag = copyfileutil.copyfile(files[i].getabsolutepath(), 
            destdirname + files[i].getname(), overlay); 
        if (!flag) 
          break; 
      } else if (files[i].isdirectory()) { 
        flag = copyfileutil.copydirectory(files[i].getabsolutepath(), 
            destdirname + files[i].getname(), overlay); 
        if (!flag) 
          break; 
      } 
    } 
    if (!flag) { 
      message = "复制目录" + srcdirname + "至" + destdirname + "失败!"; 
      joptionpane.showmessagedialog(null, message); 
      return false; 
    } else { 
      return true; 
    } 
  } 
 
  public static void main(string[] args) { 
    string srcdirname = "c:/test/test0/test1"; 
    string destdirname = "c:/ttt"; 
    copyfileutil.copydirectory(srcdirname, destdirname, true); 
  } 
} 

不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):

private static void niotransfercopy(file source, file target) { 
  filechannel in = null; 
  filechannel out = null; 
  fileinputstream instream = null; 
  fileoutputstream outstream = null; 
  try { 
    instream = new fileinputstream(source); 
    outstream = new fileoutputstream(target); 
    in = instream.getchannel(); 
    out = outstream.getchannel(); 
    in.transferto(0, in.size(), out); 
  } catch (ioexception e) { 
    e.printstacktrace(); 
  } finally { 
    close(instream); 
    close(in); 
    close(outstream); 
    close(out); 
  } 
} 

如果需要监测复制进度,可以用第二快的方法(留意buffer的大小,对速度有很大影响):

private static void niobuffercopy(file source, file target) { 
  filechannel in = null; 
  filechannel out = null; 
  fileinputstream instream = null; 
  fileoutputstream outstream = null; 
  try { 
    instream = new fileinputstream(source); 
    outstream = new fileoutputstream(target); 
    in = instream.getchannel(); 
    out = outstream.getchannel(); 
    bytebuffer buffer = bytebuffer.allocate(4096); 
    while (in.read(buffer) != -1) { 
      buffer.flip(); 
      out.write(buffer); 
      buffer.clear(); 
    } 
  } catch (ioexception e) { 
    e.printstacktrace(); 
  } finally { 
    close(instream); 
    close(in); 
    close(outstream); 
    close(out); 
  } 
} 

常用的方法1是:

private static void custombufferbufferedstreamcopy(file source, file target) { 
  inputstream fis = null; 
  outputstream fos = null; 
  try { 
    fis = new bufferedinputstream(new fileinputstream(source)); 
    fos = new bufferedoutputstream(new fileoutputstream(target)); 
    byte[] buf = new byte[4096]; 
    int i; 
    while ((i = fis.read(buf)) != -1) { 
      fos.write(buf, 0, i); 
    } 
  } 
  catch (exception e) { 
    e.printstacktrace(); 
  } finally { 
    close(fis); 
    close(fos); 
  } 
} 

常用的方法2是:

private static void custombufferstreamcopy(file source, file target) { 
  inputstream fis = null; 
  outputstream fos = null; 
  try { 
    fis = new fileinputstream(source); 
    fos = new fileoutputstream(target); 
    byte[] buf = new byte[4096]; 
    int i; 
    while ((i = fis.read(buf)) != -1) { 
      fos.write(buf, 0, i); 
    } 
  } 
  catch (exception e) { 
    e.printstacktrace(); 
  } finally { 
    close(fis); 
    close(fos); 
  } 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。