Подтвердить что ты не робот

Как преобразовать InputStream в FileInputStream

У меня есть эта строка в моей программе:

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");

Но как я могу получить FileInputStream из него [Resource_InputStream]?

4b9b3361

Ответ 1

Используйте ClassLoader#getResource(), если его URI представляет допустимый путь к файловой системе локального диска.

URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...

Если это не так (например, JAR), лучше всего скопировать его во временный файл.

Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...

Тем не менее, я действительно не вижу никакой пользы от этого, или это должно быть необходимо из-за плохого вспомогательного класса/метода, который требует FileInputStream вместо InputStream. Если вы можете, просто исправьте API, чтобы попросить вместо него InputStream. Если это третья сторона, обязательно сообщите об этом как об ошибке. Я бы в этом конкретном случае также поставил вопросительные знаки вокруг остальной части этого API.

Ответ 2

Короче говоря: Не используйте FileInputStream как параметр или тип переменной. Используйте абстрактный базовый класс, в этом случае InputStream.

Ответ 3

Вам нужно что-то вроде:

    URL resource = this.getClass().getResource("/path/to/resource.res");
    File is = null;
    try {
        is = new File(resource.toURI());
    } catch (URISyntaxException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        FileInputStream input = new FileInputStream(is);
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Но он будет работать только в вашей среде IDE, а не в runnable JAR. У меня возникла такая же проблема здесь.