0

Javaのパス(Eclipseを使用)と少し混乱しています。これは私のファイル構造です:

 Folder

    Subfolder

        file.txt

    jarfile.jar

そのため、jar ファイルが file.txt からデータを解析するようにしようとしています。次のコードを使用します。

Scanner in = new Scanner(this.getClass().getResourceAsStream("./Subfolder/file.txt"));

Eclipse で実行可能な jar ファイルを作成し、フォルダに入れましたが、動作しません。私が間違っているのは何ですか?

4

4 に答える 4

2

オブジェクトを介してリソース ファイルを使用するため、リソースClassへのパスは絶対パスである必要があります。

getClass().getResourceAsStream("/Subfolder/file.txt");

つまり、参照していないリソースでスキャナーを開くことは悪い考えです。

new Scanner(someInputStreamHere());

その入力ストリームへの参照がないため、閉じることができません。

さらに、リソースが存在しない場合は.getResource*()戻ります。nullこの場合、NPE を取得します。

Java 6 を使用する場合 (Guava の Closer を使用) に推奨:

final URL url = getClass().getResource("/path/to/resource");

if (url == null) // Oops... Resource does not exist
    barf();

final Closer closer = Closer.create();
final InputStream in;
final Scanner scanner;

try {
    in = closer.register(url.openStream());
    scanner = closer.register(new Scanner(in));
    // do stuff
} catch (IOException e) {
    throw closer.rethrow(e);
} finally {
    closer.close();
}

Java 7 を使用している場合は、try-with-resources ステートメントを使用してください。

final URL url = getClass().getResource("/path/to/resource");

if (url == null) // Oops... Resource does not exist
    barf();

final InputStream in;
final Scanner scanner;

try (
    in = url.openStream();
    scanner = new Scanner(in);
) {
    // do stuff
} catch (IOException e) {
    // deal with the exception if needed; or just declare it at the method level
}
于 2013-06-30T16:57:02.080 に答える
1

例として、Java はプラットフォームに依存しないため、必要に応じて相対絶対パスまたは正規パスを取得する方法を見てください。これで何をすべきかがわかると思います。

/**
 * This method reads the AcronymList.xlsx and is responsible for storing historical acronyms
 * and definitions.
 * @throws FileNotFoundException
 * @throws IOException
 * @throws InvalidFormatException 
 */
public file readAcronymList() throws FileNotFoundException, IOException, InvalidFormatException {
    String accListFile = new File("src\\org\\alatecinc\\acronymfinder\\dal\\acIgnoreAddList\\AcronymList.xlsx").getCanonicalPath();
    File acFile = new File(accListFile).getAbsoluteFile();
    return acFile;
}
于 2013-06-30T16:50:52.933 に答える
0

なぜリソース?txt ファイルは Jar ファイルに埋め込まれていますか? jar からファイルをロードします。

既に入力したパスで File または FileInputStream を使用するだけです。

于 2013-06-30T16:46:12.707 に答える
0

次のコードを使用します。

Scanner in = new Scanner( getClass().getResource("Subfolder/file.txt"));

于 2013-06-30T16:46:01.100 に答える