我正在尝试在Java中执行以下操作
给出像"/a/b/c"
这样的目录路径我希望得到一个字符串数组["a", "b", "c"]
。代码如下:
private static final String DIRECTORY_PATH_SEPARATOR = "/";
Iterator iter = testPaths.iterator();
String[] directories;
while( iter.hasNext() ) {
directories = ( ( String ) iter.next() ).split(DIRECTORY_PATH_SEPARATOR);
}
但我得到的数据也是空间。我希望用length>0
获得所有这些字符串
我怎样才能做到这一点??
答案 0 :(得分:4)
如果路径以分隔符开头,那么您获得空字符串(在有效路径中)的唯一位置将是第一个项目。如果它有前导分隔符,则在没有它的路径上拆分。
String path = "/a/b/c";
String[] directories = path.substring(1).split(DIRECTORY_PATH_SEPARATOR);
// { "a", "b", "c" }
如OmnipotentEntity所述,我对有效路径的假设是错误的。在使用split()
时,你必须通过数组并保持非空字符串。
String path = "/a/b////c";
String[] split = path.split(DIRECTORY_PATH_SEPARATOR);
ArrayList<String> directories = new ArrayList<String>(split.length);
for (String dir : split)
if (dir.length() > 0)
directories.add(dir);
另一种方法是使用实际正则表达式来匹配非分隔符:
String path = "/a/b////c";
ArrayList<String> directories = new ArrayList<String>();
Pattern regex = Pattern.compile("[^" + DIRECTORY_PATH_SEPARATOR + "]+");
Matcher matcher = regex.matcher(path);
while (matcher.find())
directories.add(matcher.group());
答案 1 :(得分:3)
您应该使用File类,而不是正则表达式。
答案 2 :(得分:1)
String.split(String)
方法不是很灵活,其结果可能令人惊讶(例如,静默地丢弃空尾随字符串)。我正在为我的所有项目使用Guava libraries(Google核心库为Java),并且它包含一个非常好的Splitter
实用程序,它以一种非常易读且可预测的方式执行您想要的操作:
String path = "/a/b///c///";
Iterable<String> directories = Splitter
.on(DIRECTORY_PATH_SEPARATOR)
.omitEmptyStrings()
.split(path);
这为您提供了一个可以直接在for循环中使用的迭代:
for(String directory : directories) {
System.out.println(directory);
}
在这种情况下,它甚至不创建存储目录的中间对象,但它会动态创建它们。
如果确实需要目录列表,可以将iterable复制到ArrayList
或数组中,如下所示:
List<String> dirList = Lists.newArrayList(directories);
String[] dirArray = Iterables.toArray(directories, String.class);
作为结束语:要编写可移植代码,您应使用File.separator
代替DIRECTORY_PATH_SEPARATOR
。
答案 3 :(得分:0)
这是一个使用文件系统例程的更可靠的非正则表达式版本:
public static List<String> splitFilePath(final File f){
if(f == null){
throw new NullPointerException();
}
final List<String> result = new ArrayList<String>();
File temp = f.getAbsoluteFile();
while(temp != null){
result.add(0, temp.getName());
temp = temp.getParentFile();
}
return result;
}
测试代码:
public static void main(final String[] args){
final File f = new File("foo/bar/phleem.txt");
final List<String> parts = splitFilePath(f);
System.out.println(parts);
}
<强>输出:强>
[,home,seanizer,projects,eclipse,helios2,stackfiddler,foo,bar,phleem.txt]
我返回一个List,因为它更有用,但没有什么可以阻止你更改方法返回数组或使用它来转换外部结果:
List<String> parts = splitFilePath(f);
String[] partsAsArray = parts.toArray(new String[parts.size()]);