5

コードを見直しています

私の Java アプリケーションは、Java 6 を使用して Windows と Unix で実行され、ファイルを操作します。file.separator を使用してファイル システムに依存しない方法でファイル セパレーターを取得できることはわかっていますが、Windows ファイル セパレーター char を直接指定する場合は、Java エスケープ文字でもある '\' を操作することはできません。ファイルパス。したがって、私のコードでは、 \' を '/' に置き換えることにより、ファイルパスを常に UNIX 表記で保存してきました。これらのパスはデータベースに保存されているため、そこにもエスケープの問題があると考えました。したがって、 file.separator を使用しようとすると「\」ではなく「\」が返されるため失敗するという錯覚に陥っていましたが、実際に引用符で明示的に指定する場合は \ だけが必要であることに気付きました。

今、これはすべて不必要だと思っています。常に file.separator を使用している限り、この変換を行う必要はありません。正しいですか?

編集:問題と思われるケースを見つけました

"C:\Fred\test1.txt".split("\\\\");
"C:\Fred\test1.txt".split(System.getProperty("file.separator"));

\ で文字列を分割したい場合、\ は正規表現で特別な意味を持つため、2 倍にします。したがって、file.separator を使用する行は失敗します

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.compile(Pattern.java:1466)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:823)

ただし、UNIX ではそのような要件はありません。対応する '/' をエスケープしないでください。

編集 2: この質問は、システム ファイル区切り記号を使用してファイル名を分割する前に尋ねられました。解決策は、入力の周りで Pattern.quote() を使用するか、正規表現ではなくファイル メソッドを使用しようとすることです。どちらも少し不必要ですが、システムに依存しない方法でファイルを表示できればいいのですが、Java 7のパスに同じ問題があるとは思いません。

EDIT 3: また、db からの読み取り/書き込みに関する問題を見て、データベースに Windows パスを格納し、Java を使用して Hibernate で取得するという別の質問を作成しました

4

1 に答える 1

5

はい、その通りです。File.Seperator を使用する場合、Windows では既にエスケープされているため、追加のエスケープは必要ありません。Javaドキュメントから。

separatorChar

public static final char separatorChar

The system-dependent default name-separator character. 
This field is initialized to contain the first character of the value of the system property file.separator. 
On UNIX systems the value of this field is '/';
on Microsoft Windows systems it is '\\'. 
于 2012-06-28T09:36:55.620 に答える