为什么不直接使用 File.mkdirs()
呢?
编辑:根据您的要求不使用File.mkdirs():
我仍然认为使用File
作为辅助类更容易:
package com.example.test;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
public class FileSplitter {
final private File path;
public List<String> getPathStrings()
{
LinkedList<String> list = new LinkedList<String>();
File p = this.path;
while (p != null)
{
list.addFirst(p.getPath());
p = p.getParentFile();
}
return list;
}
public FileSplitter(File path) { this.path = path; }
public static void main(String[] args) {
doit(new File("/foo/bar/baz"));
doit(new File("/bam/biff/boom/pow"));
}
private static void doit(File file) {
for (String s : new FileSplitter(file)
.getPathStrings())
System.out.println(s);
}
}
在我的电脑上(windows系统),这将打印出以下内容:
\
\foo
\foo\bar
\foo\bar\baz
\
\bam
\bam\biff
\bam\biff\boom
\bam\biff\boom\pow
如果您无论如何都需要使用正斜杠,那么我建议使用字符串而不是文件进行实现,或者在使用时执行.replace('\\','/')
。
最后,这里有一种方法可能对您的最终应用程序更有帮助。
它与之前的输出相同,但适合于控制反转的倒置,
在其中,您可以执行自定义的mkdir()
作为伪Runnable传递为路径迭代器的步骤:
package com.example.test;
import java.io.File;
public class PathRunner
{
final private File path;
public PathRunner(File path) {
this.path = path;
}
public interface Step
{
public boolean step(File path);
}
public boolean run(Step step)
{
return run(step, this.path);
}
private boolean run(Step step, File p)
{
if (p == null)
return true;
else if (!run(step, p.getParentFile()))
return false;
else
return step.step(p);
}
public static void main(String[] args) {
doit(new File("/foo/bar/baz"));
doit(new File("/bam/biff/boom/pow"));
}
private static boolean doit(File path) {
Step step = new Step()
{
@Override public boolean step(File path) {
System.out.println(path);
return true;
}
};
return new PathRunner(path).run(step);
}
}
File.mkdirs()
是正确的方式。然而,如果您非常坚持手动创建,可以使用split("//")
来分割路径,然后用 for 循环实现:String[] bits = path.split("//"); File f = null; for(int i=0;i<bits.length;i++){ if(f = null) f = new File(bit[i]); else f = new File(f, bits[i]); f.mkdir(); }
- Femi