Почему бы просто не использовать File.mkdirs()
?
edit: согласно вашему требованию не использовать 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);
}
/**** test methods ****/
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;
/* in a mkdir operation, here's where you would call:
return yourObject.mkdir(
path.getPath().replace('\\', '/')
);
*/
}
};
return new PathRunner(path).run(step);
}
}