System.IO.Path.Combine()
C#/.NET に相当する Java はありますか? またはこれを達成するためのコードはありますか?
この静的メソッドは、1 つ以上の文字列をパスに結合します。
System.IO.Path.Combine()
C#/.NET に相当する Java はありますか? またはこれを達成するためのコードはありますか?
この静的メソッドは、1 つ以上の文字列をパスに結合します。
すべてを文字列ベースにするのではなく、ファイル システム パスを表すように設計されたクラスを使用する必要があります。
Java 7 または Java 8 を使用している場合は、使用を強く検討する必要がありますjava.nio.file.Path
。Path.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();
}
主な答えは、File オブジェクトを使用することです。ただし、 Commons IOには、 concat()メソッドなど、この種のことを実行できるFilenameUtilsクラスがあります。
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();
}
}
JodaStephen の回答を強化するために、Apache Commons IO にはこれを行う FilenameUtils があります。例 (Linux の場合):
assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log"
プラットフォームに依存せず、システムに必要なセパレーターを生成します。
複数のパス部分とエッジ条件を処理するソリューションは次のとおりです。
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();
}