Получение файла, используемого FileInputStream

Можно ли получить File, используемое FileInputStream? FileInputStream, по-видимому, не имеет каких-либо методов для его получения.


person Jenna Sloan    schedule 20.11.2016    source источник
comment
вы можете использовать отражения, как показано в моем ответе, посмотрите   -  person developer    schedule 20.11.2016


Ответы (1)


В API FileInputStream нет прямых методов, но если вы действительно хотите, вы можете использовать API отражения Java, чтобы получить path (фактическое имя файла с полным путем), как показано ниже:

FileInputStream fis = new FileInputStream(inputFile);
Field field = fis.getClass().getDeclaredField("path");
field.setAccessible(true);
String path  = (String)field.get(fis);
System.out.println(path);

Переменная path (содержит имя файла с путем) объявлена ​​в классе FileInputStream как закрытое конечное поле, которое мы получаем с помощью кода отражения, как показано выше.

P.S.: Обратите внимание, что описанный выше подход не может гарантировать достижение результата во всех реализациях JVM, поскольку он не определен в спецификации.

person developer    schedule 20.11.2016
comment
Это работает только для реализаций FileInputStream, в которых есть такой элемент. В договоре нет ничего, что требовало бы этого. - person user207421; 20.11.2016
comment
На самом деле я не могу найти такое поле в JDK 1.6, 1.7 или 1.8 ни для FileInputStream, ни для FileOutputStream. Вы проверяли это? - person user207421; 20.11.2016
comment
да, я проверял это, работает отлично - person developer; 20.11.2016
comment
Кроме того, только что посмотрел файл класса, в котором показана эта переменная: private final String path; - person developer; 20.11.2016
comment
Какая версия? Не присутствует в тех, которые я упомянул. 1.7 и 1.8 — это OpenJDK, другой — src.zip, распространяемый вместе с JDK. Мне кажется, что вы смотрите на java.io.File. Нет причин, по которым FileInputStream должен хранить переменную path. Он не нужен за пределами конструктора. - person user207421; 20.11.2016
comment
1.8 версии JDK, использовал мой декомпилятор eclipse - person developer; 20.11.2016