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ユーティリティは、正しいファイル区切り文字を使用するように文字列パスを変換しますか?
_Apache Commons
_が(再び)救出に来ます。 _Commons IO
_メソッド FilenameUtils.separatorsToSystem(String path)
は必要な処理を実行します。
言うまでもなく、_Apache Commons IO
_は他にも多くのことを行うので、一見の価値があります。
"/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);
}
}
これは、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);
}
}
したがって、余分な依存関係を避けたい場合は、それを使用してください。
新しいJava 7では、Pathsと呼ばれるクラスが含まれています。これにより、希望どおりの操作を実行できます( http://docs.Oracle.com/javase/tutorial/エッセンシャル/io/pathOps.html )
ここに例があります:
String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
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ファイル全体をロードして単純なこともしたくありません。この場合、彼らは私がとにかく提案するものを持っていません。
使用するオプションはありますか
System.getProperty("file.separator")
パスを表す文字列を作成するには?
7年後にこれを行おうとしている人のために、Apache commons separatorsToSystemメソッドがFilenameUtilsクラスに移動されました。
FilenameUtils.separatorsToSystem(String path)
String fileName = Paths.get(fileName).toString();
たとえば、少なくとも混合パスでもWindowsで完全に動作します
c:\ users\username/myproject\myfiles/myfolder
なる
c:\users\username\myproject\myfiles\myfolder
Linuxが上記をどのように構成するかを確認していませんが、Linuxのファイル構造が異なるため、このようなディレクトリを検索しません。
この関数を作成して、文字列に\
文字が含まれているかどうかを確認し、/
に変換します
public static String toUrlPath(String path) {
return path.indexOf('\\') < 0 ? path : path.replace('\\', '/');
}
public static String toUrlPath(Path path) {
return toUrlPath(path.toString());
}
言うだけで十分ではありません:
"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"