Я знаю getResourceAsStream()
метод, но существует проблема с синтаксическим анализатором, который читает файл, целая структура была реализована для ожидания a FileInputStream()
и getResourceAsStream()
возвращает входной поток, который не может быть литым. Есть ли кто-либо легкая "фиксация" для этой ситуации?
Ресурс, содержащийся в файле JAR, сам по себе не является файлом и не может быть прочитан с помощью FileInputStream
. Если у вас есть код, который абсолютно требует FileInputStream
, вам нужно извлечь данные с помощью getResourceAsStream ()
, скопировать их во временный файл, а затем передать FileInputStream
для этого временного файла в ваш код.
Конечно, в будущем никогда не пишите код, ожидающий конкретных реализаций таких вещей, как InputStream
, вы всегда будете сожалеть об этом.
Недавно я столкнулся с той же проблемой. Сторонняя библиотека, которую мы используем, читает из 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();
}
}
не верят, что ваш парсер работает только на FileInputStream, но не на InputStream
, если это реальный случай, и вы должны использовать этот парсер
2 опции
использовать шаблон адаптера для создания CustomFileInputStream и перезаписать соответствующие методы, больше перенаправляйте данные getResourceAsStream в CustomFileInputStream
сохраните getResourceAsStream в временный файл и разберите временный файл, затем удалите файл по завершению