黑马程序员技术交流社区

标题: 文件合并的问题 [打印本页]

作者: 李长波    时间: 2012-11-11 23:36
标题: 文件合并的问题
大家可能都知道文件的复制,但是我想问的是假设D:/123下有10个不同的文件,怎么把这十个文件合并成一个了,同时删除掉原来的十个文件?
作者: 黑马_宋超    时间: 2012-11-12 19:30
首先new一个File出来,然后把第一个文件的内容写入到这个新的文件里,然后第二个文件从这个新new出来的File的结尾处开始写入,依次类推,就可以了吧
作者: 王阳    时间: 2012-11-12 21:24
以下代码应该可以解决你那个问题,并且可以解决合并更多的文件带来文件名排序问题

package test;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

public class problem {
        @SuppressWarnings("unchecked")
        public static void main1(String[] args) throws IOException {
                //合并
                //创建输入和输出流对象
                FileInputStream input = null;
                FileOutputStream fos = new FileOutputStream("test\\IO.JPG");
        
                //创建一个TreeSet集合并传入一个比较器
                TreeSet<File> list = new TreeSet<File>(new Compare());
                //创建要合并的文件目录,并获取其中文件数组
                File file = new File("test");
                //定义一个过滤去,讲不为.part的文件全部过滤掉
                File[] files = file.listFiles(new FileFilter() {
                        @Override
                        public boolean accept(File pathname) {
                                // TODO Auto-generated method stub
                                return pathname.getName().endsWith("part");
                        }
                });
                //将文件数组转换为集合并保存至TreeSet
        list.addAll(Arrays.asList(files));
        
        //创建byte数组和变量len
                byte[] arr = new byte[1024];
                int len = 0;
                //循环迭代文件集合并读取每个文件内容并写入输出流
                for (File subFile : list) {
                        System.out.println(subFile.getName());
                        input = new FileInputStream(subFile);
                        len = input.read(arr);
                        fos.write(arr, 0, len);
                        //关闭流和删除.part文件
                        input.close();
                        subFile.delete();
                }
        //关闭流
                fos.close();
        }
        public static void main(String[] args) throws IOException {
                //切割文件并创建输出和输入流
                File file = new File("test\\IO.JPG");
                FileInputStream input = new FileInputStream(file);
                FileOutputStream out = null;
                //定义byte数组和变量len与count
                byte[] arr = new byte[1024];
                int len = 0,count = 0;
                //读取输入流的文件并以1KB大小循环写入从0开始递增的.part文件中
            while ((len = input.read(arr))!=-1) {
                    out = new FileOutputStream("test\\" + count+++".part");
                        out.write(arr, 0, len);
                        //关闭流
                        out.close();
                }
        //关闭流
                input.close();
        }
}
//创建一个文件比较器,根据文件的名称来比较进行自然排序
class Compare implements Comparator<File> {

        @Override
        public int compare(File o1, File o2) {
                return new Integer(o1.getName().substring(0,
                                o1.getName().lastIndexOf(".")).toString())
                                .compareTo(new Integer(o2.getName().substring(0,
                                                o2.getName().lastIndexOf(".")).toString()));
        }

}

作者: 李长波    时间: 2012-11-12 21:27
方法可以!但有种极限要考虑!假设是10000个txt文件了!你的效率怎么保障!
作者: 李长波    时间: 2012-11-12 21:27
王阳 发表于 2012-11-12 21:24
以下代码应该可以解决你那个问题,并且可以解决合并更多的文件带来文件名排序问题

package test;

方法可以!但有种极限要考虑!假设是100000个txt文件了!你的效率怎么保障!
作者: 王阳    时间: 2012-11-12 21:39
TO:李长波
          有点不太明白,你指的效率是指读取效率吗?那就加上buffered缓冲类好了。
作者: 王阳    时间: 2012-11-12 21:53
刚才试了试,把创建字节数组的改为byte[] arr = new byte[1],确实比较慢,由于必须考虑单线程的关系,文件数量又是那么多,没想到啥方法可以解决。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2