日期:2014-05-20  浏览次数:20926 次

java相关的File问题
我需要建立一些文件夹,首先在根目录下建立一个number文件夹,然后在number中建立以1-9数字命名的文件夹,然后又要在1-9每一个文件夹中再次建立以1-9命名的文件夹,一共要创建9层,我该如何写才能保证代码量较少,而且执行速度快,上次我写了一个,结果执行了大半天都没完成,而且代码貌似还有点多了。初学者,求大家指教.

------解决方案--------------------
以前学过树的遍历吧?把你的需求当作是树就行了。

用递归实现遍历就行了,深度优先或广度优先都行,关键是构造递归函数,伪代码如下:

@param rootDir 根目录
@param range 单层目录的数量,你的要求就是9了
@param deep 目录深度,你的要求还是9了
public void treeDirCreate(File rootDir, int range, int deep) {
for (int i = 1 ~ range) {
File newRoot = xxooxxoo; // 以i为名称创建好目录
if (deep > 1) treeDirCreate(newRoot, range, deep-1); // 递归调用
}
}
------解决方案--------------------
是用FTP上传就简单多了。
Java code
    public int upload(InputStream in, String newname) throws IOException {
        TelnetOutputStream os = null;
        byte[] bytes = new byte[1024];
        try {
            newname = newname.substring(newname.lastIndexOf("/")+1);//获取文件名称
            os = ftpClient.put(newname);

            int c;
            while ((c = in.read(bytes)) != -1) {
                os.write(bytes, 0, c);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return 0;

        }
        os.flush();
        in.close();
        os.close();
        //ftpClient.closeServer();
        bytes = null;
        return 1;

    }

    
    /**
     * 创建及寻找需要上传文件的目录
     * @param path
     * @return boolean
     * 如果有违例,请使用@exception/throws [违例类型]   [违例说明:异常的注释必须说明该异常的含义及什么条件下抛出该 
     * @see          [类、类#方法、类#成员]
     */
    public boolean isDirExist(String path) {
        try {
            ftpClient.cd(path);//进入需要上传文件的目录
        } catch (IOException e) {
            ftpClient.sendServer("MKD " + path + "\r\n");//如果该目录不存在,则创建
            try {
                ftpClient.cd(path); //进入需要上传文件的目录
                ftpClient.readServerResponse();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        return true;
    }

------解决方案--------------------
其实就是获得
number/1/1/1/1/1/1/1/1/1
number/1/1/1/1/1/1/1/1/2
number/1/1/1/1/1/1/1/1/3
...
number/9/9/9/9/9/9/9/9/9
这样的路径组合,所以循环处理一下就可以了,获得这样的字符串,直接调用File的mkdirs就可以了,不用每一层都去自己mkdir

for example

Java code
File root = new File("/number"); //number目录
if (root.exists() && root.isFile()) { //如果该文件存在并且是个文件,则删除,否则没法建目录
    root.delete();
}
if (! root.exists()) { //如果该文件不存在,则创建number目录
    root.mkdir();
}
//一下是循环,创建子目录,就是获取子目录组合的字符串,调用File的mkdirs方法
int deep = 9;
int[] range = {1,2,3,4,5,6,7,8,9};
int[] idx = new int[deep];
StringBuilder buf = new StringBuilder();
while (idx[0] < range.length) {
    buf.delete(0, buf.length());
    buf.append(root.getPath());
    for (int i=0; i<idx.length; i++) {
        buf.append("/").append(range[idx[i]]);
    }
    File dir = new File(buf.toString());
    dir.mkdirs();

    idx[idx.length-1]++;
    for (int i=idx.length-1; i>0; i--) {
        if (idx[i] == range.length) {
            idx[i] = 0;
            idx[i]++;
        } else {
            break;
        }
    }
}

------解决方案--------------------
不是代码问题,是文件太多了。
一棵满九叉树,九的九次方个。我只做了三叉:
Java code
import java.io.*;

public class Test {
    static final int N = 3;
    public static void main(String[] args) {
        String s0 = "d:/number";
        File f = new File(s0);
        if (!f.exists()) {
            f.mkdir();
        }
        for (int i = 1; i <= N; i++) {
            String s1 = new String(s0 + "/" + i);
            // mkd(s1);
            for (int j = 1; j <= N; j++) {
                String s2 = new String(s1 + "/" + j);
                // mkd(s2);
                for (int k = 1; k <= N; k++) {
                    String s3 = new String(s2 + "/" + k);
                    mkd(s3);
                }
            }
        }
    }

    static void mkd(String s) {
        File f = new File(s);
        f.mkdirs();
        //System.out.println(s);
    }
}