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

他とは異なる解決策は、FileAPIから名前を取得することです。

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 に答える
1

正規表現分割を使用してみてくださいroot.split(":?\\\\")

于 2012-10-24T11:37:02.807 に答える
0

String.split()メソッドを試してください。http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String

分割するときは正規表現を使用するので、非常に高度な処理を実行できます。あなたのために分割することはそれをする\\かもしれません。

正規表現に機能を追加するため\、「正規表現」ではなく文字としてマークする必要があります。それはダブルを説明します。

于 2012-10-24T11:35:55.393 に答える