【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作

来源:互联网 发布:户外主播用的什么网络 编辑:程序博客网 时间:2024/05/29 16:18

一、基本目标

使用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");}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 从公务员调入事业单位的怎么办 电车被城管扣了怎么办 超变战陀发射器绳坏了怎么办 家里人总打击我怎么办干啥都要骂 欧陆风云4破产后怎么办 车被别人喷了漆怎么办 龙分期绑银行卡维护钱还不上怎么办 去维和要是伤了怎么办 头盔镜片刮花了怎么办 小牛u1钥匙丢了怎么办 非牛顿流体干了怎么办 刺激战场0信誉分怎么办 假如非牛顿干了怎么办? 退出id后照片了怎么办 小麦收割机麦糠有籽粒怎么办 在家带娃没钱花怎么办 看3d电影近视的怎么办 摩托车电瓶没电了怎么办 踏板摩托车电瓶没电了怎么办 摩托车离合油没了怎么办 论文数据计算错误该怎么办 脚被擦破皮了痛怎么办 脚撞到了很疼怎么办 腿不小心磕青了怎么办 木制椅子腿断了怎么办 实木椅子腿断了怎么办 铁质椅子腿断了怎么办 大套摩托车查车怎么办 摩托车本扣12分怎么办 蓝牙耳机上面的软套掉了怎么办 工作不想干了怎么办啊 浴室门玻璃坏了怎么办 电梯顶层安全安全距离不合格怎么办 制冰机有些孔不出水怎么办 制冰机排水孔堵住了怎么办 点我达装备抽查怎么办 空军常服大檐帽有一点变形怎么办 一般纳税人没有进项发票怎么办 汽车购买发票丢了怎么办 购买房子的发票丢了怎么办 购买的二手房发票丢失怎么办