5

Java 1.6 を使用すると、ユーザーがファイルパスを入力できます。その後、さまざまな正規表現を適用して、プラットフォームで無効な文字 (Windows では無効な「?」など) を削除し、パスの長さをチェックして、最終的に有効なファイルパスになるようにします。ファイルパスを作成する前に、OS の

しかし、次の 2 つの問題があります。

  1. 各プラットフォームで何が有効かどうかを判断するのは面倒です。
  2. プラットフォームのデフォルトのファイルシステムに基づいて推測していますが、もちろん OSX システムが FAT32 などの Mac 以外のファイルシステムに書き込んでいる可能性があります。その場合、これらのチェックは無効になります。

Java 7 で NIO2 を使用するより良い方法があることを期待していましたが、まだ解決策を見つけていません。

4

3 に答える 3

5

期待される結果 (修正された文字列? 無効な文字位置? 例外?) に応じて、これにより何ができるかがわかります。

import java.io.File;
import java.nio.file.InvalidPathException;
public class Test {
    public static final void main(final String[] args) {
        final String current = new File(".").toPath().toAbsolutePath().normalize().toFile().toString();
        Test.correctPath(current);
        Test.correctPath(current + "aValidExpression");
        Test.correctPath(current + "aValidExpression?;:-&é");
        Test.correctPath(current + "aValidExpr//ession?;:-&é");
        Test.correctPath(current + "aValidExpre\\ssion?;:-&é");
    }

    public static final String correctPath(final String path) {
        try {
            final String returnValue = new File(path).toPath().toAbsolutePath().normalize().toFile().toString();
            System.out.println(returnValue);
            return returnValue;
        } catch (final InvalidPathException e) {
            System.err.println(e.getMessage());
            final int errorIndex = e.getIndex();
            final String newPath = path.substring(0, errorIndex - 1) + path.substring(errorIndex + 1);
            return Test.correctPath(newPath);
        }
    }
}

お役に立てば幸いです。

于 2012-12-05T09:59:42.893 に答える
2

あなたの質問の鍵は、「プラットフォームで無効な文字を削除する」というフレーズです。やなどのさまざまなString変換Path関数は、文字列がパスとして有効かどうかを教えてくれますが、無効な理由は教えてくれません。無効になる 1 つの方法は、無効な文字を含めることです。もう 1 つは、たとえば、あまりにも多くのスラッシュ文字を一緒に使用することです。とにかく、図書館はこれ以上の情報を提供しません。ユーザーが入力エラーを修正するのに役立つ方法で、ユーザー入力の検証を支援する機能は提供されません。確かに、これは標準的な慣行であるべきですが、ほとんど慣習ではありません。get()resolve()

結論: そのような検証ライブラリが必要な場合は、自分で作成する必要があります。利点: このような問題を抱えているのは、あなただけではありません。

于 2012-11-30T15:48:08.880 に答える
1

Path.getPathを見るべきだと思います

public static Path get(String first,
   String... more)

 getPath("/foo","bar","gus")-->/foo/bar/gus

パス文字列、または結合するとパス文字列を形成する一連の文字列を Path に変換します。more に要素が指定されていない場合、最初のパラメーターの値は変換するパス文字列になります。more が 1 つ以上の要素を指定する場合、first を含む各空でない文字列は名前要素のシーケンスと見なされ (Path を参照)、パス文字列を形成するために結合されます。文字列を結合する方法の詳細はプロバイダー固有ですが、通常は区切り記号として名前区切り記号を使用して結合されます。たとえば、名前区切り文字が「/」で getPath("/foo","bar","gus") が呼び出されると、パス文字列「/foo/bar/gus」がパスに変換されます。first が空の文字列で、 more に空でない文字列が含まれていない場合、空のパスを表す Path が返されます。

于 2012-10-09T17:07:17.707 に答える