Как я могу получить доступ к txt файлу в банке с FileInputStream?

Я знаю getResourceAsStream() метод, но существует проблема с синтаксическим анализатором, который читает файл, целая структура была реализована для ожидания a FileInputStream() и getResourceAsStream() возвращает входной поток, который не может быть литым. Есть ли кто-либо легкая "фиксация" для этой ситуации?

6
задан Lipis 15 June 2011 в 19:30
поделиться

3 ответа

Ресурс, содержащийся в файле JAR, сам по себе не является файлом и не может быть прочитан с помощью FileInputStream . Если у вас есть код, который абсолютно требует FileInputStream , вам нужно извлечь данные с помощью getResourceAsStream () , скопировать их во временный файл, а затем передать FileInputStream для этого временного файла в ваш код.

Конечно, в будущем никогда не пишите код, ожидающий конкретных реализаций таких вещей, как InputStream , вы всегда будете сожалеть об этом.

20
ответ дан 8 December 2019 в 04:30
поделиться

Недавно я столкнулся с той же проблемой. Сторонняя библиотека, которую мы используем, читает из FileInputStream, но ресурсы могут быть где угодно, в JAR или удаленно. Раньше мы записывали во временные файлы, но это слишком накладно.

Лучшее решение - написать FileInputStream, который обертывает InputStream. Вот используемый нами класс

public class VirtualFileInputStream extends FileInputStream {

    private InputStream stream;

    public VirtualFileInputStream(InputStream stream) {
        super(FileDescriptor.in); // This will never be used
        this.stream = stream;
    }




    public int available() throws IOException {
        throw new IllegalStateException("Unimplemented method called");
    }


    public void close() throws IOException {
        stream.close();
    }


    public boolean equals(Object obj) {
        return stream.equals(obj);
    }


    public FileChannel getChannel() {
        throw new IllegalStateException("Unimplemented method called");
    }


    public int hashCode() {
        return stream.hashCode();
    }


    public void mark(int readlimit) {
        stream.mark(readlimit);
    }


    public boolean markSupported() {
        return stream.markSupported();
    }


    public int read() throws IOException {
        return stream.read();
    }


    public int read(byte[] b, int off, int len) throws IOException {
        return stream.read(b, off, len);
    }


    public int read(byte[] b) throws IOException {
        return stream.read(b);
    }


    public void reset() throws IOException {
        stream.reset();
    }


    public long skip(long n) throws IOException {
        return stream.skip(n);
    }


    public String toString() {
        return stream.toString();
    }

}
5
ответ дан 8 December 2019 в 04:30
поделиться

не верят, что ваш парсер работает только на FileInputStream, но не на InputStream

, если это реальный случай, и вы должны использовать этот парсер

2 опции

  1. использовать шаблон адаптера для создания CustomFileInputStream и перезаписать соответствующие методы, больше перенаправляйте данные getResourceAsStream в CustomFileInputStream

  2. сохраните getResourceAsStream в временный файл и разберите временный файл, затем удалите файл по завершению

0
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: