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

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

3 ответов


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

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


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

лучшим решением является запись 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();
    }

}

Не верьте, что ваш синтаксический анализ работает только на FileInputStream, но не InputStream

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

2 варианта

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

  2. сохранить УР методаgetresourceasstream во временный файл и парсить файл Temp, затем удалите файл, когда закончите