编写一个程序,将一个目录及其子目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容达到1Mbytes时,剩下的内容存储到第二个文件中,依次往下,新产生的文本文件名依次为1.txt、2.txt、……。
package test;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class IoTest {        public StringBuffer fileDoc(File path,StringBuffer sb){
                //目录列表数组
                File[] files = path.listFiles();
                
                //字节流读取
                FileInputStream fileInputStream = null;
                
                for(File file1 : files){
                        if(file1.isDirectory()){//如果是目录
                                //递归
                                fileDoc(file1,sb);
                        }else{
                                try {
                                        fileInputStream = new FileInputStream(file1);
                                        int size = fileInputStream.available();
                                        byte[] tempByte = new byte[size];
                                        
                                        if(fileInputStream.read(tempByte) != size){
                                                System.out.println("文件读取失败!!!");
                                        }else{
                                                //内容转换
                                                String change = new String(tempByte,"utf-8");
                                                
                                                sb.append(change);
                                        }
                                        
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
                
                return sb;
        }
        
        //保存数据
        public static void saveDataForTxt(StringBuffer sbStr){
                //总数据
                String allStr = sbStr.toString();
                byte[] bytes = allStr.getBytes();
                
                //将数据放到字节输入流中
                ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
                
                //1k的数据
                byte[] newbytes = new byte[1024];
                
                int len = 0;
                int i = 1;
                
                try {
                        while((len = bais.read(newbytes)) != -1){
                        File file = new File("d:\\java\\"+i+".txt");
                        new FileOutputStream(file).write(newbytes,0,len);
                        i++;
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
        
        
        public static void main(String[] args) {
                String path = "d:\\TDDownload\\Test1";
                File file = new File(path);
                
                //要得到的数据集合(初始)
                StringBuffer sbTemp = new StringBuffer();
                
                sbTemp = new IoTest().fileDoc(file,sbTemp);
                
                saveDataForTxt(sbTemp);
        }
}

解决方案 »

  1.   

    每个文件写1Mbytes的数据,然后再写第二个文件
    byte[] newbytes = new byte[1024];
    这条明显示是1K的数据,改成
    byte[] newbytes = new byte[1024*1024];输入输出流,用完要close掉。
      

  2.   

    源代码没有问题的
    只是这个方法fileDoc是没必要要返回值的,因为StringBuffer是可变的字符串,你在方法里面改变了,方法调用完之后,外面的也会改变
      

  3.   


    package a;import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;public class IoTest { public StringBuffer fileDoc(File path, StringBuffer sb) {
    // 目录列表数组
    File[] files = path.listFiles(); // 字节流读取
    FileInputStream fileInputStream = null; for (File file1 : files) {
    if (file1.isDirectory()) {// 如果是目录
    // 递归
    fileDoc(file1, sb);
    } else {
    try {
    fileInputStream = new FileInputStream(file1);
    int size = fileInputStream.available();
    byte[] tempByte = new byte[size]; if (fileInputStream.read(tempByte) != size) {
    System.out.println("文件读取失败!!!");
    } else {
    // 内容转换
    String change = new String(tempByte, "utf-8"); sb.append(change);
    } } catch (Exception e) {
    e.printStackTrace();
    }
    }
    } return sb;
    } // 保存数据
    public static void saveDataForTxt(StringBuffer sbStr) {
    // 总数据
    String allStr = sbStr.toString();
    byte[] bytes = allStr.getBytes(); // 将数据放到字节输入流中
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes); // 1k的数据
    byte[] newbytes = new byte[1024]; int len = 0;
    int i = 1;
    int cnt = 0;
    int totleCnt = 1024 * 1024; // 1M
    File file = null; //1、在 try外面定义 
    FileOutputStream fos = null;
    try {
    while ((len = bais.read(newbytes)) != -1) {
    if (cnt == 0) { //刚开始读取 或者刚读完1M的时候需要重新new一个file 和fos ,写入
    file = new File("d:\\java\\" + i + ".txt");
    fos = new FileOutputStream(file, true); //2、以追加的模式
    }
    fos.write(newbytes, 0, len);
    cnt += len;
    if (cnt == totleCnt) {
    cnt = 0 ;
    i++;
    fos.flush() ; //3 、写完1M,应该把 fos flush() ,然后关闭 ;
    fos.close() ;
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    String path = "d:\\Java\\Test1";
    File file = new File(path); // 要得到的数据集合(初始)
    StringBuffer sbTemp = new StringBuffer(); sbTemp = new IoTest().fileDoc(file, sbTemp); saveDataForTxt(sbTemp);
    }
    }
      

  4.   

    各位,我用JCreator和JDK1.40编译,通不过,你们那里能通过?
      

  5.   


    我想我知道哪里出错了
    for(File file1 : files)这个表达式是java1.5新增的,在java1.4中没有你可以把这句话改为for (int i = 0; i < files.length; i++)
    {
        //for里面的内容中,将file1改成files[i]
        ......
    }
    或者你把java版本换成1.5及以上版本,这样会更好一点