3

可能重复:
如何在java中拆分字符串

FileSystemView fsv = FileSystemView.getFileSystemView();
File[] roots = fsv.getRoots();
for (int i = 0; i < roots.length; i++)
{
  System.out.println("Root: " + roots[i]);
}
System.out.println("Home directory: " + fsv.getHomeDirectory());

根目录:C:\Users\RS\Desktop 主目录:C:\Users\RS\Desktop

我想剪切根目录或主目录组件,如字符串 C、用户、RS、桌面

4

7 回答 7

11

我宁愿不要屈服于使用拆分文件名的诱惑,因为 java 有自己的更简洁的跨平台函数来进行路径操作。

我认为这种基本模式适用于 java 1.4 及更高版本:

    File f = new File("c:\\Some\\Folder with spaces\\Or\\Other");
    do {
        System.out.println("Parent=" + f.getName());
        f = f.getParentFile();
    } while (f.getParentFile() != null);
    System.out.println("Root=" + f.getPath());

将输出:

    Path=Other
    Path=Or
    Path=Folder with spaces
    Path=Some
    Root=c:\

您可能想先使用 f.getCanonicalPath 或 f.getAbsolutePath,因此它也适用于相对路径。

不幸的是,这需要 f.getPath 用于根,f.getName 用于其他部分,并且我以倒序创建这些部分。

更新:您可以在向上扫描时将 f 与 fsv.getHomeDirectory() 进行比较,并在发现您位于主文件夹的子目录中时中断。

于 2012-10-24T12:03:34.060 回答
5

根据 user844382 的回答,这是用于分割路径的平台安全方式:

 String homePath = FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath();
 System.out.println(homePath);
 System.out.println(Arrays.deepToString(homePath.split(Matcher.quoteReplacement(System.getProperty("file.separator")))));        
}       

在linux上它输出:

/home/isipka
[, home, isipka]

在 Windows 上它输出:

C:\Documents and Settings\linski\Desktop
[C:, Documents and Settings, linski, Desktop]

如果省略Matcher.quoteReplacement()方法调用,代码将在 Windows 上失败。此方法处理特殊字符的转义,例如“\”( Windows 上的文件分隔符)和“$”。

于 2012-10-24T12:39:37.730 回答
3

您可以为此使用 java.nio.file.Path:

FileSystemView fsv = FileSystemView.getFileSystemView();
File[] roots = fsv.getRoots();
for (int i = 0; i < roots.length; i++)
{
  System.out.println("Root: " + roots[i]);
  Path p = roots[i].toPath();
  for (int j=0; j < p.getNameCount(); j++)
     System.out.println(p.getName(j));
}
System.out.println("Home directory: " + fsv.getHomeDirectory());
于 2012-10-24T11:47:56.500 回答
2
FileSystemView fsv = FileSystemView.getFileSystemView();
File[] roots = fsv.getRoots();
for (int i = 0; i < roots.length; i++) {
    System.out.println("Root: " + roots[i]);
    for (String s : roots[i].toString().split(":?\\\\")) {
        System.out.println(s);
    }
}
System.out.println("Home directory: " + fsv.getHomeDirectory());
于 2012-10-24T11:34:35.583 回答
1

尝试使用正则表达式拆分root.split(":?\\\\")

于 2012-10-24T11:37:02.807 回答
1

与其他解决方案不同的解决方案是从 File API 获取名称:

File file = roots[i];
while (file != null) {
  if (file.getName().length() > 0) {
    System.out.println(file.getName());
  } else {
    System.out.println(file.getPath().substring(0, 1));
  }
  file = file.getParentFile();
}

此解决方案以相反的顺序返回路径,因此您必须进行一些小的更改。

于 2012-10-24T11:39:25.267 回答
0

试试 String.split() 方法。http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String )

拆分时需要正则表达式,因此可以做一些非常高级的事情。对你来说,\\可能会做到这一点。

由于\向正则表达式添加了功能,我们需要将其标记为字符而不是“正则表达式运算符”。这就解释了 double 。

于 2012-10-24T11:35:55.393 回答