A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李长波 中级黑马   /  2012-11-11 23:36  /  1383 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家可能都知道文件的复制,但是我想问的是假设D:/123下有10个不同的文件,怎么把这十个文件合并成一个了,同时删除掉原来的十个文件?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
首先new一个File出来,然后把第一个文件的内容写入到这个新的文件里,然后第二个文件从这个新new出来的File的结尾处开始写入,依次类推,就可以了吧

点评

为什么不做出来呢  发表于 2012-11-12 21:31
回复 使用道具 举报
以下代码应该可以解决你那个问题,并且可以解决合并更多的文件带来文件名排序问题

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:30

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
方法可以!但有种极限要考虑!假设是10000个txt文件了!你的效率怎么保障!
回复 使用道具 举报
王阳 发表于 2012-11-12 21:24
以下代码应该可以解决你那个问题,并且可以解决合并更多的文件带来文件名排序问题

package test;

方法可以!但有种极限要考虑!假设是100000个txt文件了!你的效率怎么保障!
回复 使用道具 举报
TO:李长波
          有点不太明白,你指的效率是指读取效率吗?那就加上buffered缓冲类好了。

点评

他说的是文件很多的情况下,应该怎么处理  发表于 2012-11-12 21:43
回复 使用道具 举报
王阳 中级黑马 2012-11-12 21:53:00
7#
刚才试了试,把创建字节数组的改为byte[] arr = new byte[1],确实比较慢,由于必须考虑单线程的关系,文件数量又是那么多,没想到啥方法可以解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马