Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹

一、基本目标

使用Java完成如下的操作:

把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹:

f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀:

二、制作过程

1、首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数

public class FileCopy {
 public static void main(String args[]) {
  new FileTest().copyFolder("f:/a", "f:/b"); 

 }
}

值得注意的是,这个的传递过去的参数的路径写法,在java中,f:/a是没有问题的,f:\a也是没有问题的,但是由于\在字符串表达的时候,必须转移,所以你必须写成f:\\a

2、整个程序的关键在这个FileTest类中的copyFolder函数,这个类里面就这个函数-_-!而且注意在程序开头引入java.io.*;由于用到了输入输出流

class FileTest {
 public void copyFolder(String oldPath, String newPath) {
  try {
   // 如果文件夹不存在,则建立新文件夹
   (new File(newPath)).mkdirs();
   //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组
   File filelist = new File(oldPath);
   String[] file = filelist.list();
   //要注意,这个temp仅仅是一个临时文件指针
   //整个程序并没有创建临时文件
   File temp = null;
   for (int i = 0; i < file.length; i++) {
    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了
    //否则要自己oldPath后面补个路径分隔符再加文件名
    //谁知道你传递过来的参数是f:/a还是f:/a/啊?
    if (oldPath.endsWith(File.separator)) {
     temp = new File(oldPath + file[i]);
    } else {
     temp = new File(oldPath + File.separator + file[i]);
    } 

    //如果游标遇到文件
    if (temp.isFile()) {
     FileInputStream input = new FileInputStream(temp);
     FileOutputStream output = new FileOutputStream(newPath
       + "/" + "rename_" + (temp.getName()).toString());
     byte[] bufferarray = new byte[1024 * 64];
     int prereadlength;
     while ((prereadlength = input.read(bufferarray)) != -1) {
      output.write(bufferarray, 0, prereadlength);
     }
     output.flush();
     output.close();
     input.close();
    }
    //如果游标遇到文件夹
    if (temp.isDirectory()) {
     copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
    }
   }
  } catch (Exception e) {
   System.out.println("复制整个文件夹内容操作出错");
  }
 }
}

可能游标遇到文件部分有点难以理解,其实是这样的,首先设置一个文件的输入流,指定从游标遇到的文件中输入,再指定输出到newPath/rename_旧文件的文件名这个文件目录,之后,设置一个缓冲数组,文件输入流对于自己要读取的文件,每次调用read方法,它都会向后继续上一次读取的位置继续读取缓冲数组bufferarray的长度的内容,把读取到的内容存储到缓冲数组,覆盖缓冲数组之前的所有内容,然后文件输出流会把缓冲数组的所有内容输出的指定的位置,直到文件输入流遇到了-1。

至于文件输入流为何能这样按顺序,每次都会向后继续上一次读取的位置继续读取,那是因为当要进行文件的读取,Java封装的FileInputStream.read方法也会调用操作系统的API依次读取这些数据。在读取文件数据的时候必须是顺序的,不可能说先读取第一个字节,后读取倒数第二个字节。循环读取的时候就read方法将读取的位置++,因此造成每次read都是顺序读取后面的字节,直到遇到文件末尾标记。

当游标遇到文件夹则重新调用自己完成同样的操作即可,这就是所谓的迭代。

3、因此整个程序如下:

import java.io.*; 

/**
 *
 * @param oldPath 被拷贝的目录
 * @param newPath 要拷贝到的目录
 *
 */
class FileTest {
 public void copyFolder(String oldPath, String newPath) {
  try {
   // 如果文件夹不存在,则建立新文件夹
   (new File(newPath)).mkdirs();
   //读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组
   File filelist = new File(oldPath);
   String[] file = filelist.list();
   //要注意,这个temp仅仅是一个临时文件指针
   //整个程序并没有创建临时文件
   File temp = null;
   for (int i = 0; i < file.length; i++) {
    //如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了
    //否则要自己oldPath后面补个路径分隔符再加文件名
    //谁知道你传递过来的参数是f:/a还是f:/a/啊?
    if (oldPath.endsWith(File.separator)) {
     temp = new File(oldPath + file[i]);
    } else {
     temp = new File(oldPath + File.separator + file[i]);
    } 

    //如果游标遇到文件
    if (temp.isFile()) {
     FileInputStream input = new FileInputStream(temp);
     FileOutputStream output = new FileOutputStream(newPath
       + "/" + "rename_" + (temp.getName()).toString());
     byte[] bufferarray = new byte[1024 * 64];
     int prereadlength;
     while ((prereadlength = input.read(bufferarray)) != -1) {
      output.write(bufferarray, 0, prereadlength);
     }
     output.flush();
     output.close();
     input.close();
    }
    //如果游标遇到文件夹
    if (temp.isDirectory()) {
     copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
    }
   }
  } catch (Exception e) {
   System.out.println("复制整个文件夹内容操作出错");
  }
 }
} 

public class FileCopy {
 public static void main(String args[]) {
  new FileTest().copyFolder("f:/a", "f:/b"); 

 }
}

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

您可能感兴趣的文章:

  • java 实现文件夹的拷贝实例代码
  • java使用nio2拷贝文件的示例
  • java文件复制代码片断(java实现文件拷贝)
(0)

相关推荐

  • java 实现文件夹的拷贝实例代码

    java 实现文件夹的拷贝实例代码         这里就直接上代码,废话不多说,很简单很实用. 实例代码: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class CopyFile { public static void copy(String sourceFile , Str

  • java使用nio2拷贝文件的示例

    这个程序只是为了更方便的进行拷贝文件(夹)而创造.1.可以不用新建文件夹,就像windows的复制粘贴一样简单.2.有简单的出错重连机制3.不需要重复拷贝,差异化复制文件.4.拷贝文件夹的时候可以不用复制全路径,只关注需要拷贝的文件夹.5.程序做了简单的必要检查,效率也不算低.6.使用的是7的nio2的新API. 复制代码 代码如下: import java.io.IOException;import java.nio.file.FileVisitResult;import java.nio.f

  • java文件复制代码片断(java实现文件拷贝)

    一.要完成这个程序需要了解的知识点: 1.编写简单的Java程序,比如hello world ---废话了....哈哈 2.了解java的文件操作 3.了解java的buffer操作 4.对文件操作的一些异常处理点:1.源文件不能读取到的情况. 2.目的文件创建失败的情况 3.文件锁问题 4.字符乱码问题...可能不全啊 这些是需要用到的包 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor

  • Java和C#输入输出流的方法(详解)

    1,Java中操作方法: import java.io.*; public class FileInputStreamTest { public static void main(String[] args) throws IOException { //创建字节输入流 FileInputStream fis = new FileInputStream("FileInputStreamTest.java"); //创建一个长度为1024的竹筒 byte[] bbuf = new byt

  • Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹

    一.基本目标 使用Java完成如下的操作: 把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹: f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀: 二.制作过程 1.首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数 public class FileCopy { pu

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • 用python实现的可以拷贝或剪切一个文件列表中的所有文件

    复制代码 代码如下: # coding:utf-8 import os import sys def cut_and_paste_file(source, destination):     '''     source: file path 中文     destination: directory path     '''     def format_path(path):         if not os.path.isabs(path):             path = os.

  • Java利用反射实现文件的读取操作

    java反射 java从很早的版本开始就引入了反射机制,java如今的框架底层大部分也都是使用反射实现的. 这篇博客就去探索下java反射使用的方便之处. 要说java的反射机制,肯定离不开Class这个类,我们从jdk的源码可以看到这个类在jdk1.0的时候就存在了. 由于我这边需要用到文件读写的功能,同时又希望写的方法相对来说比较抽象,能在多出直接使用,于是我就想到了java的反射机制. 首先这边先把我的读取文件的方法展示出来 这个是用到的接口类 /** * 实现该接口中的方法,本来打算在F

  • java 对象输入输出流读写文件的操作实例

    java 对象输入输出流读写文件的操作实例 java 支持对对象的读写操作,所操作的对象必须实现Serializable接口. 实例代码: package vo; import java.io.Serializable; public class Animal implements Serializable { private static final long serialVersionUID = 1L; private String name; private Integer weight;

  • java利用递归算法实现对文件夹的删除功能

    前提: 集成开发环境(IDE):eclipse jdk版本:8.0 File类的几个方法: 1)isFile() 测试此抽象路径名表示的文件是否为普通文件. 2)list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录. 3)delete() 删除由此抽象路径名表示的文件或目录. 4)listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件. File类的一个属性: separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串

  • java递归实现复制一个文件夹下所有文件功能

    今天开始学习java的IO,学了一个复制文件的例子程序后想自己实现以下如何复制一个文件夹,复制文件的例子程序如下: package io.github.liuzhan214; import java.io.File; import java.io.IOException; public class Main { void solve() { File file = new File("F:\\javaIOTest\\new.txt"); if(!file.exists()) { try

  • JAVA利用递归删除文件代码实例

    这篇文章主要介绍了JAVA利用递归删除文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天需要用到删除文件的方法,一年前这个时候也写过当时,写的是一个文件夹下面不存在其他文件夹,只存在子文件.但是那时不知道存在什么情况,总是出现文件删不掉,虽然到现在也不知道什么原因,猜测 是什么流被占用吧[我记得当时流都关了的... 今天是利用递归删除,发现递归真的蛮好用的,就是有时效率太低...虽然简单但是也贴上来吧 public boolean

  • java利用POI读取excel文件的方法

    摘要:利用java读取excel文件,读取文件并获取文件中每一个sheet中的值. 一.需要提前导入的包: import java.io.File; import java.io.FileInputStream; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook

随机推荐