オブジェクトを介してリソース ファイルを使用するため、リソース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
}