编写一个程序,将一个目录及其子目录下的所有txt类型的文本文件中的内容和并到若干个新文件中,当第一个新产生的文件中存储的内容达到1M bytes时,剩下的内容存储到第二个文件中,依次往下,新产生的文本文件名依次为 1.txt, 2.txt.......

解决方案 »

  1.   

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    public class Files {
    String srcdir = "src";
    String descdir = "desc"; File srcfile = null;
    FileInputStream fis = null;
    FileOutputStream fos = null;
    int descfilenum = 1;
    long size = 0;
    final long MaxSize = 1024*1000; //1M public Files() {
    } public Files(String src, String desc) {
    srcdir = src;
    descdir = desc;
    } public void go() throws Exception {
    srcfile = new File(srcdir);
    if ((!srcfile.exists()) || (!srcfile.isDirectory())) {
    throw new Exception("\"" + srcdir + "\" dir does not exist!");
    } File descfile = new File(descdir);
    if ((!descfile.exists()) || (!srcfile.isDirectory())) {
    descfile.mkdir();
    }
    fos = new FileOutputStream(descdir + "\\" + descfilenum + ".txt");
    nest(srcdir);
    fos.close();
    }

    public void nest(String dir) throws Exception {
    srcfile = new File(dir);
    String[] files = srcfile.list();
    boolean havesubdir = false;
    //处理文件
    for (int i=0; i<files.length; i++) {
    srcfile = new File(dir + "\\" + files[i]);
    if (srcfile.isDirectory()) {
    havesubdir = true;
    continue;
    } else {
    fis = new FileInputStream(srcfile);
    System.out.println(srcfile.getPath());
    int n;
    byte[] buf = new byte[4096];
    while ((n = fis.read(buf, 0, buf.length)) != -1) {
    write(buf, n);
    }
    }
    }
    //没有子目录,返回
    if (!havesubdir) {
    return;
    }
    //处理文件夹
    for (int i=0; i<files.length; i++) {
    srcfile = new File(dir + "\\" + files[i]);
    if (srcfile.isFile()) {
    continue;
    }
    nest(srcfile.getPath());
    } } public void write(byte[] buffer, int end) throws Exception {
    int p = 0;
    while (p < end) {
    if (size >= MaxSize) {
    descfilenum++;
    size = 0;
    fos.close();
    fos = new FileOutputStream(descdir + "\\" + descfilenum + ".txt"); 
    } int len = end - p;
    if ((size+len) > MaxSize) {
    int m = (int)(MaxSize - size);
    fos.write(buffer, p, m);
    p += m;
    size += m;
    } else {
    fos.write(buffer, p, end-p);
    size += (end - p);
    p = end;
    }
    }
    }
    public static void main(String[] args) {
    try {
    Files f = new Files("src", "dest");
    f.go();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }}
      

  2.   

    楼上的搞那么复杂,还要高分。。
    看看兄弟我这个
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;public class TestRead { /**
     * @param args
     */
    static int fileNumber=1;
    public void fileOp(File file) 
    {

    if(file.isDirectory())
    {
    File[] files=file.listFiles();
    for(int i=0;i<files.length;i++)
    {
    File tempFile=files[i];
    if(tempFile.isFile())
    {
    if(tempFile.getName().lastIndexOf(".txt")>=0)
    {
    copyData(tempFile);
    System.out.println(fileNumber);
    }
    }
    else
    {
    fileOp(tempFile);
    }
    }
    }
    }

    private void copyData(File file)
    {
    try
    {
    File tempWriteFile=new File("/temp/"+String.valueOf(fileNumber)+".txt");
    BufferedReader br=new BufferedReader(new FileReader(file));
    BufferedWriter bw=null;

    String tempBr=null;
    tempBr=br.readLine();
    while(tempBr!=null)
    {
    if(tempWriteFile.length()>=1024)
    {
    fileNumber++;
    }
    tempWriteFile=new File("/temp/"+String.valueOf(fileNumber)+".txt");
    bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
    bw.write(tempBr + "\r\n");
    tempBr=br.readLine();
    }
    bw.close();
    br.close();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    public static void main(String[] args)
    {
    File file=new File("/");
    (new TestRead()).fileOp(file);
    }
    }
      

  3.   

    第一个程序只要写.txt类型的怎么改啊
      

  4.   

    更正(之前有点)bug:
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;public class TestRead { /**
     * @param args
     */
    private static int fileNumber=1;
    private File tempWriteFile=null;
    private BufferedWriter bw=null;
    public void fileOp(File file,String temp)
    {

    if(file.isDirectory()&&!file.equals(new File(temp)))
    {
    File[] files=file.listFiles();
    if(files!=null)
    {
    for(int i=0;i<files.length;i++)
    {
    File tempFile=files[i];
    if(tempFile.isFile())
    {
    if(tempFile.getName().lastIndexOf(".txt")>=0)
    {
    copyData(tempFile,temp);
    System.out.println(tempFile.getAbsolutePath());
    }
    }
    else
    {
    fileOp(tempFile,temp);
    }
    }
    }
    }
    }

    private void copyData(File file,String temp)
    {
    try
    {
    this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
    BufferedReader br=new BufferedReader(new FileReader(file));
    this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));

    String tempBr=null;
    tempBr=br.readLine();
    while(tempBr!=null)
    {
    if(this.tempWriteFile.length()+tempBr.length()>=1024*1024)
    {
    this.bw.close();
    fileNumber++;
    this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
    this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
    }
    bw.write(tempBr + "\r\n");
    tempBr=br.readLine();
    }
    bw.close();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    public static void main(String[] args)
    {
    File file=new File("c:/");
    (new TestRead()).fileOp(file,"e:/test/temp");
    System.out.print("Finished!");
    }
    }
      

  5.   

    同时建议搂主,如果要想提高io访问效率的话,还是用
    java.io.BufferedReader;
    java.io.BufferedWriter;
    比较好
      

  6.   

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;public class TestRead { /**
     * @param args
     */
    private static int fileNumber=1;
    private File tempWriteFile=null;
    private BufferedWriter bw=null;
    public void fileOp(File file,String temp)
    {

    if(file.isDirectory()&&!file.equals(new File(temp)))
    {
    File[] files=file.listFiles();
    if(files!=null)
    {
    for(int i=0;i<files.length;i++)
    {
    File tempFile=files[i];
    if(tempFile.isFile())
    {
    if(tempFile.getName().lastIndexOf(".txt")>=0)
    {
    copyData(tempFile,temp);
    System.out.println(tempFile.getAbsolutePath());
    }
    }
    else
    {
    fileOp(tempFile,temp);
    }
    }
    }
    }
    }

    private void copyData(File file,String temp)
    {
    try
    {
    this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
    BufferedReader br=new BufferedReader(new FileReader(file));
    this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));

    String tempBr=null;
    tempBr=br.readLine();
    while(tempBr!=null)
    {
    if(this.tempWriteFile.length()+tempBr.length()>=1024*1024)
    {
    this.bw.close();
    fileNumber++;
    this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
    this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
    }
    bw.write(tempBr + "\r\n");
    tempBr=br.readLine();
    }
    bw.close();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    public static void main(String[] args)
    {
    String savedDoc="e:/temp";
            String srcDoc="e:/";
            File file=new File(srcDoc);
            File savedDocFile=new File(savedDoc);
            if(savedDocFile.exists())
            {
             File[] fileTemp;
             fileTemp=savedDocFile.listFiles();
             for(int i=0;i<fileTemp.length;i++)
             {
             fileTemp[i].delete();
             }
            }
            else
            {
             savedDocFile.mkdir(); 
            }
            (new TestRead()).fileOp(file,savedDoc);
            System.out.print("Finished!");
    }
    }
      

  7.   

    gzpoplar(poplar) 的程序比较正确,但缺少过滤txt文件的功能
    hdhmail2000(禅剑飞雪)的程序中,不能正确分割文件大小,我用每个文件1k来测试,结果有的文件竟然是2.2k,不过我也没看出程序中错误的地方
    下面是本人对gzpoplar(poplar) 程序的改进:
    package csdn.example;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    public class File_csdn1 {
    String srcdir = "src";
    String descdir = "desc";

    File srcfile = null;
    FileInputStream fis = null;
    FileOutputStream fos = null;
    int descfilenum = 1;
    long size = 0;
    final long MaxSize = 1024*1024;//1M

    public File_csdn1() {
    }

    public File_csdn1(String src, String desc) {
    srcdir = src;
    descdir = desc;
    }

    public void go() throws Exception {
    srcfile = new File(srcdir);
    if ((!srcfile.exists()) || (!srcfile.isDirectory())) {
    throw new Exception("\"" + srcdir + "\" dir does not exist!");
    }

    File descfile = new File(descdir);
    if ((!descfile.exists()) || (!srcfile.isDirectory())) {
    descfile.mkdir();
    }
    fos = new FileOutputStream(descdir + "/" + descfilenum + ".txt");
    nest(srcdir);
    fos.close();
    }

    public void nest(String dir) throws Exception {
    srcfile = new File(dir);
    String[] files = srcfile.list();

    boolean havesubdir = false;
    //处理文件
    for (int i=0; i<files.length; i++) {
    srcfile = new File(dir + "/" + files[i]);
    if (srcfile.isDirectory()) {
    havesubdir = true;
    continue;

    else {
    if(srcfile.getName().lastIndexOf(".txt")>=0){//过滤txt文件
    fis = new FileInputStream(srcfile);
    //System.out.println(srcfile.getPath());
    int n;
    byte[] buf = new byte[4096];
    while ((n = fis.read(buf, 0, buf.length)) != -1) {
    write(buf, n);
    }
    }
    else
    continue;
    }
    }
    //没有子目录,返回
    if (!havesubdir) {
    return;
    }
    //处理文件夹
    for (int i=0; i<files.length; i++) {
    srcfile = new File(dir + "/" + files[i]);
    if (srcfile.isFile()) {
    continue;
    }
    nest(srcfile.getPath());
    }
    }

    public void write(byte[] buffer, int end) throws Exception {
    int p = 0;
    while (p < end) {
    if (size >= MaxSize) {
    descfilenum++;
    size = 0;
    fos.close();
    fos = new FileOutputStream(descdir + "/" + descfilenum + ".txt");
    }
    int len = end - p;
    if ((size+len) > MaxSize) {
    int m = (int)(MaxSize - size);
    fos.write(buffer, p, m);
    p += m;
    size += m;

    else {
    fos.write(buffer, p, end-p);
    size += (end - p);
    p = end;
    }
    }
    }


    public static void main(String[] args) {
    try {
    File_csdn1 f = new File_csdn1("/root/temp", "/root/temp1");
    f.go();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }}注意:descdir不应该是srcdir的子目录,否则容易发生混乱,程序会出错
      

  8.   

    当然了,我的是以行来确定大小的,不可能刚好那么多的大小
    想想如果用txt文件的,总不能一边半行吧?
      

  9.   

    当然了,我的是以行来确定大小的,不可能刚好那么多的大小
    想想如果用txt文件的,总不能一边半行吧?
    --------------------------------------------
    呵呵,有道理,不过,我是以每个文件1k的大小来存储的,结果文件却为2.2k,2.3k
      

  10.   

    第一次来这里发贴,很高兴大家帮忙解决了问题。
    多谢啦!
    还是字节流的读取比较准确,gzpoplar(poplar)的方法挺好,hbcui1984的补充很及时,谢谢啦!