Сканер: избавление от «утечки ресурсов:»"никогда не закрывается" - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь создать своего рода служебный метод для чтения текстовых файлов из ресурсов в Spring Boot.Чтобы прочитать файлы, я смотрю на них как InputStream s:

Resource resource = new ClassPathResource(fileLocationInClasspath);
InputStream resourceInputStream = resource.getInputStream();

(обратите внимание, что Resource#getInputStream выдает IOException )

Тогда я пытаюсьиспользовать Сканер , как упомянуто в глупых хитростях сканера вместо Reader или чего-то еще, поскольку это элегантно-простой способ сделать это.

ОднакоУ меня проблемы с избавлением от предупреждения, указанного в заголовке вопроса.Даже если я просто позвоню scanner.close() (до java-8 way), предупреждение останется.

Попытка № 1 (первое посещение):

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A")) {
        return sc.next();
    }
}

Попытка № 2:

public static String readFileFromResources(String fileName) throws IOException {
    Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A");
    String text = sc.next();
    sc.close();
    return text;
}

Попробуйте # 3 (предупреждение исчезнет):

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A")) {
        return sc.next();
    } catch (Exception e) // Note Exception class
    {
        throw new IOException(e); //Need to catch this later
    }
}

Может кто-нибудь объяснить, почему попытка # 1 и попытка # 2 выдает предупреждение?Я думаю try # 3 нет, потому что мы перехватываем все возможные исключения.Но единственное исключение, которое может быть выброшено, - это метод IOException из getInputStream().Если Scanner является подозрительным для какого-либо исключения, почему оно не заставляет нас ловить это исключение?В конце концов, перехват исключений с использованием Exception не рекомендуется.

Наконец, я подумал, может быть, это проблема STS (Spring tool suite)?

(Если это играет какую-либо роль,> Версия JDK: 1.8.0_191)

1 Ответ

2 голосов
/ 08 марта 2019

На самом деле проблема связана с useDelimiter(), так как следующий код не имеет такой проблемы и должен давать тот же результат:

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream())) {
        sc.useDelimiter("\\A");
        return sc.next();
    }
}

Я не уверен, что именно вызывает утечку ресурсов, но я полагаю, что это цепочка команд, которую вы использовали

...