2015-12-25 5 views
57

内のパスへの参加:は、私が<code>os.path.join</code>で二つの経路に参加でき<code>Python</code>でのJava

os.path.join("foo", "bar") # => "foo/bar" 

私はOSUnixSolarisまたはWindowsであれば気にせずに、Javaで同じことをachiveしようとしている:

public static void main(String[] args) { 
    Path currentRelativePath = Paths.get(""); 
    String current_dir = currentRelativePath.toAbsolutePath().toString(); 
    String filename = "data/foo.txt"; 
    Path filepath = currentRelativePath.resolve(filename); 

    // "data/foo.txt" 
    System.out.println(filepath); 

} 

私は、Path.resolve()が現在のディレクトリ/home/user/testdata/foo.txtを結ぶことを期待していました。/home/user/test/data/foo.txtです。 何が間違っていますか?

+0

これは私が見ていないものかもしれません。あなたの現在のパスは ""です。あなたの2番目のパスは "data/foo.txt"です。おそらくあなたの問題は 'filepath.toString()'の代わりにPathオブジェクトを表示しているようです。 – cjds

+0

'' '新しいファイル(親子)' ''を使用しています – saka1029

答えて

44

empty Stringを使用して現在のディレクトリを取得するための元のソリューションが機能しても、ただし、現在のディレクトリにはuser.dirプロパティ、ホームディレクトリにはuser.homeプロパティを使用することをお勧めします。

Path currentPath = Paths.get(System.getProperty("user.dir")); 
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt"); 
System.out.println(filePath.toString()); 

出力:

/Users/user/coding/data/foo.txt 

のJava Pathクラスのドキュメントから:それは1つのname要素でのみ構成されている場合はパスが空のパスと見なされ

empty。ファイルシステムのempty path is equivalent to accessing the default directoryを使用してファイルにアクセスしています。


空の文字列がPaths.get("")に渡されるとPaths.get("").toAbsolutePath()作品

、返さPathオブジェクトは空のパスが含まれている理由。しかし、Path.toAbsolutePath()を呼び出すと、パスの長さがゼロより大きいかどうかがチェックされます。そうでなければ、user.dirシステムプロパティが使用され、現在のパスが返されます。ここで

は、UNIXファイルシステムの実装のためのコードです:UnixPath.toAbsolutePath()


基本的に、あなたは現在のディレクトリパスを解決した後、再びPathインスタンスを作成する必要があります。

また、プラットフォームに依存しないコードにはFile.separatorCharを使用することをお勧めします。

Path currentRelativePath = Paths.get(""); 
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it. 
String filename = "data" + File.separatorChar + "foo.txt"; 
Path filepath = currentDir.resolve(filename); 

// "data/foo.txt" 
System.out.println(filepath); 

出力:

/Users/user/coding/data/foo.txt 
+0

誰かが文字列で作業していると思うかもしれませんし、 'separatorChar' append( "foo.txt") ' – jingyu9575

14

Paths#get(String first, String... more)状態、

パス文字列、または文字列のシーケンスを変換するPathに、フォームパス文字列に接合します。

...最初は空の文字列 であり、よりを任意の空でない文字列が含まれていない場合パスを表す

Path返されます。

現在のユーザーディレクトリを取得するには、単にSystem.getProperty("user.dir")を使用します。

Path path = Paths.get(System.getProperty("user.dir"), "abc.txt"); 
System.out.println(path); 

また、get方法は、後続のパス文字列を提供するために使用される、Stringvariable length argumentを使用します。だから、/test/inside/abc.txtためPathを作成するために、あなたは、次のように

Path path = Paths.get("/test", "inside", "abc.txt"); 
7

ない具体的な方法を、それを使用する必要があります。

は、Java 8以上を使用する場合は、2つのオプションがあります:あなたは、Java 7を使用している場合

a)の使用java.util.StringJoiner

StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator 
joiner.add("path1").add("path2"); 
String joinedString = joiner.toString(); 

b)はString.join(File.pathSeparator, "path1", "path2");

を使用しますか、 apacheコモンズからcommons-langライブラリを使用することができます。 StringUtilsクラスには、セパレータを使用して文字列を結合するメソッドがあります。

C)StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);

追記:あなたは(だけ絶対パスのようなものであることを覚えておいてください窓用のLinux pathseparator "/" を使用することができます。 "/ C:/ mydir1/mydir2を" 常に使用 "/" 非常にありますあなたがそのようなファイルなどのプロトコルを使用する場合に便利://

+0

StringJoinerが私に'/home/user/test:fooを返しました。これはいくつかの "高水準抽象化"に劣ります。 txt' – cybertextron

+0

あなたが知っているオプションだけが存在するわけではありません。たとえば、joinerの代わりにStringBuilderを使用することができます。そして、実際には、ファイル/パスではなく文字列に基づいた実装は非常に素朴で、多くのシナリオで問題を引き起こします。 – XenoRo

+0

これは物事を行う1つの方法ですが、実際には最良の方法ではありません。 – VGR

5

を最も基本的な方法は次のとおりです。

Path filepath = Paths.get("foo", "bar"); 

あなたはPaths.get("")を書くべきではありません、私は全く機能している驚いているあなたはを参照したい場合。現在のディレクトリを明示的に使用する場合はPaths.get(System.getProperty("user.dir"))。ユーザーのホームディレクトリが必要な場合は、Paths.get(System.getProperty("user.home"))を使用します。

また、アプローチを組み合わせることができます。

Path filepath = Paths.get(
    System.getProperty("user.home"), "data", "foo.txt"); 
1

Javaでのパスに参加する最も信頼性の高い、プラットフォームに依存しない方法は、(Paths::getのJavadocで述べたように)Path::resolveを使用することです。パスの一部を表すStringの任意の長さの配列の場合、これらはJavaストリームを使用して結合できます。

private static final String[] pieces = { 
    System.getProperty("user.dir"), 
    "data", 
    "foo.txt"}; 
public static void main (String[] args) { 
    Path dest = Arrays.stream(pieces).reduce(
    /* identity */ Paths.get(""), 
    /* accumulator */ Path::resolve, 
    /* combiner */ Path::resolve); 
    System.out.println(dest); 
} 
関連する問題

 関連する問題