411

System.IO.Path.Combine()C#/.NET に相当する Java はありますか? またはこれを達成するためのコードはありますか?

この静的メソッドは、1 つ以上の文字列をパスに結合します。

4

12 に答える 12

470

すべてを文字列ベースにするのではなく、ファイル システム パスを表すように設計されたクラスを使用する必要があります。

Java 7 または Java 8 を使用している場合は、使用を強く検討する必要がありますjava.nio.file.PathPath.resolveあるパスを別のパスまたは文字列と結合するために使用できます。Pathsヘルパー クラスも便利です。例えば:

Path path = Paths.get("foo", "bar", "baz.txt");

Java-7 より前の環境に対応する必要がある場合は、次java.io.Fileのようにを使用できます。

File baseDirectory = new File("foo");
File subDirectory = new File(baseDirectory, "bar");
File fileInDirectory = new File(subDirectory, "baz.txt");

後で文字列として戻したい場合は、 を呼び出すことができますgetPath()。実際、本当に を模倣したい場合はPath.Combine、次のように記述できます。

public static String combine(String path1, String path2)
{
    File file1 = new File(path1);
    File file2 = new File(file1, path2);
    return file2.getPath();
}
于 2009-01-05T07:29:27.477 に答える
46

主な答えは、File オブジェクトを使用することです。ただし、 Commons IOには、 concat()メソッドなど、この種のことを実行できるFilenameUtilsクラスがあります。

于 2009-01-05T13:05:10.480 に答える
18

Jonの最初の回答から長い時間が経っていることは知っていますが、OPにも同様の要件がありました。

Jon のソリューションを拡張することで、次のように思いつきました。これは、1 つまたは複数のパス セグメントを取り、投げることができる数のパス セグメントを取ります。

使用法

Path.combine("/Users/beardtwizzle/");
Path.combine("/", "Users", "beardtwizzle");
Path.combine(new String[] { "/", "Users", "beardtwizzle", "arrayUsage" });

同様の問題を抱えている他の人のためにここにコードを書いてください

public class Path {
    public static String combine(String... paths)
    {
        File file = new File(paths[0]);

        for (int i = 1; i < paths.length ; i++) {
            file = new File(file, paths[i]);
        }

        return file.getPath();
    }
}
于 2012-02-05T09:31:15.280 に答える
11

JodaStephen の回答を強化するために、Apache Commons IO にはこれを行う FilenameUtils があります。例 (Linux の場合):

assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log"

プラットフォームに依存せず、システムに必要なセパレーターを生成します。

于 2010-11-14T13:31:21.200 に答える
2

複数のパス部分とエッジ条件を処理するソリューションは次のとおりです。

public static String combinePaths(String ... paths)
{
  if ( paths.length == 0)
  {
    return "";
  }

  File combined = new File(paths[0]);

  int i = 1;
  while ( i < paths.length)
  {
    combined = new File(combined, paths[i]);
    ++i;
  }

  return combined.getPath();
}
于 2010-12-07T18:36:46.170 に答える