Как я могу получить доступ к TXT-файлу в банке с FileInputStream? - PullRequest
6 голосов
/ 16 декабря 2009

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

Ответы [ 3 ]

20 голосов
/ 16 декабря 2009

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

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

5 голосов
/ 16 декабря 2009

Я недавно столкнулся с той же проблемой. Сторонняя библиотека, которую мы используем, читает из 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();
    }

}
0 голосов
/ 16 декабря 2009

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

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

2 варианта

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

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

...