web-dev-qa-db-ja.com

正しいファイル区切り文字を使用するように文字列パスを変換するJavaユーティリティはありますか?

Javaでファイルを操作するいくつかのクラスを開発しました。私はLinuxボックスで作業しており、幸いにもnew File("path/to/some/file");と入力しています。コミットするときが来たとき、プロジェクトの他の開発者の何人かがWindowsを使用していることに気付きました。次に、"/path/to/some/file"という形式の文字列を受け取り、OSによっては正しく区切られたパスを返すことができるメソッドを呼び出したいと思います。

例えば:
"path/to/some/file"は、Windowsでは"path\\to\\some\\file"になります。
Linuxでは、指定された文字列を返すだけです。

これを実行できる正規表現を使用するのに時間がかからないことはわかっていますが、私はホイールを再発明するつもりはなく、適切にテストされたソリューションを好みます。 JDKに組み込まれていればいいのですが、それが小さなF/OSSライブラリの一部である場合も問題ありません。

Javaユーティリティは、正しいファイル区切り文字を使用するように文字列パスを変換しますか?

22
Grundlefleck

_Apache Commons_が(再び)救出に来ます。 _Commons IO_メソッド FilenameUtils.separatorsToSystem(String path) は必要な処理を実行します。

言うまでもなく、_Apache Commons IO_は他にも多くのことを行うので、一見の価値があります。

40
Brian Agnew

"/path/to/some/file" Windows VistaおよびXPでは実際にが機能します

new Java.io.File("/path/to/some/file").getAbsoluteFile()

> C:\path\to\some\file

しかし、Windowsには複数の rootsがあるため、依然として移植性はありません。したがって、ルートディレクトリは何らかの方法で選択する必要があります。相対パスに問題はないはずです。

編集:

Apache commons ioは、unixとwindows以外の環境でnotをサポートします。 Apache ioソースコード

public static String separatorsToSystem(String path) { 
    if (path == null) {
     return null;
    }
    if (isSystemWindows()) {
      return separatorsToWindows(path);
    } else {
      return separatorsToUnix(path);
    }
}
16
Thomas Jung

これは、Apache commons-ioが行うことで、数行のコードに展開されます。

String separatorsToSystem(String res) {
    if (res==null) return null;
    if (File.separatorChar=='\\') {
        // From Windows to Linux/Mac
        return res.replace('/', File.separatorChar);
    } else {
        // From Linux/Mac to Windows
        return res.replace('\\', File.separatorChar);
    }
}

したがって、余分な依存関係を避けたい場合は、それを使用してください。

6

新しいJava 7では、Pathsと呼ばれるクラスが含まれています。これにより、希望どおりの操作を実行できます( http://docs.Oracle.com/javase/tutorial/エッセンシャル/io/pathOps.html

ここに例があります:

String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
4
Gigas64

Javaパスにこの穴があると思います。

_String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
_

使用する必要のあるファイルシステムがあるシステムで実行している場合に機能します。指摘したように、現在のOSファイルシステムを使用しました。

WindowsとLinux間のパスを操作する必要があります。たとえば、ファイルを別のファイルにコピーする必要があります。すべての「/」を使用している間、すべてのJavaコマンドを使用していると思いますが、/または_file.separator_などを使用しても役に立たないため、sftpを呼び出す必要があります。 Path()を使用できません。これは、私が「今」実行しているデフォルトのファイルシステムに変換するためです。

Javaに必要なもの:
Windowsシステム:

_Path posixPath = Paths.get("/home/mystuff", FileSystem.Posix );
stays /home/mystuff/  and does not get converted to \\home\\mystuff

on linux system:
String winPath = Paths.get("c:\home\mystuff", FileSystem.Windows).toString();
_

_c:\home\mystuff_のままで、_/c:/home/mystuff_に変換されません

文字セットの操作に似ています:

_URLEncoder.encode( "whatever here", "UTF-8" ).getBytes();
_

追伸また、Apache io jarファイル全体をロードして単純なこともしたくありません。この場合、彼らは私がとにかく提案するものを持っていません。

3
Stan Towianski

使用するオプションはありますか

System.getProperty("file.separator")

パスを表す文字列を作成するには?

2
Adam

7年後にこれを行おうとしている人のために、Apache commons separatorsToSystemメソッドがFilenameUtilsクラスに移動されました。

FilenameUtils.separatorsToSystem(String path)
2
java-addict301
String fileName = Paths.get(fileName).toString();

たとえば、少なくとも混合パスでもWindowsで完全に動作します

c:\ users\username/myproject\myfiles/myfolder

なる

c:\users\username\myproject\myfiles\myfolder

Linuxが上記をどのように構成するかを確認していませんが、Linuxのファイル構造が異なるため、このようなディレクトリを検索しません。

1
John Perczyk

この関数を作成して、文字列に\文字が含まれているかどうかを確認し、/に変換します

public static String toUrlPath(String path) {
  return path.indexOf('\\') < 0 ? path : path.replace('\\', '/');
}

public static String toUrlPath(Path path) {
  return toUrlPath(path.toString());
}
0
Daniel De León

言うだけで十分ではありません:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"
0
Dimitri