Получить имя файла из FileOutputStream - PullRequest
41 голосов
/ 08 февраля 2011

Есть ли способ получить имя файла из FileOutputStream или из FileInputStream?

Ответы [ 5 ]

31 голосов
/ 08 февраля 2011

Похоже, что ответ отрицательный:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html
http://docs.oracle.com/javase/7/docs/api/index.html?java/io/FileOutputStream.html

Нет открытых методов, которые возвращают File или String, использованные при построениипоток.

РЕДАКТИРОВАТЬ: То же самое относится к FileInputStream.

14 голосов
/ 08 февраля 2011

Эта функция не предоставляется готовым File-Input / Output-Stream, но ничто не мешает вам написать свой собственный подкласс, который хранит File (или fileName) и предоставляет для него метод получения.

Я бы предложил реализовать для этого некоторый интерфейс FileNameAware, поскольку на потоки ввода-вывода обычно ссылаются абстрактные классы InputStream / OutputStream, чтобы избежать связывания вашего приложения с конкретными реализациями.

12 голосов
/ 06 ноября 2015

Возможно, с отражением : ответ Тома Г правильный, т.е. нет API для получения пути.Однако, если вы застряли, как я, с фреймворком, который вы не можете изменить и не можете получить имя файла каким-либо другим способом, вы можете использовать отражение, чтобы получить путь (в моем случае мне это понадобилось для целей отладки).*

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

Недоступно в 1.6 и 1.7 Подтверждено в версии 1.8.

2 голосов
/ 20 ноября 2016

Это невозможно, даже в принципе.Предположение вопроса состоит в том, что каждый поток ввода файла связан с одним файлом с одним именем.Последнее предположение неверно для систем POSIX.Для систем POSIX файл может иметь любое количество имен (жестких ссылок), включая ноль.Случай с нулевыми именами довольно распространен для временных файлов, чтобы гарантировать, что временный файл будет удален при выходе из программы.

Я написал много файлового кода ввода-вывода и никогда не нуждался в этой функциональности.То, что вы просите об этом, говорит о том, что у вас есть недостаток дизайна.То есть у вас проблема XY.

  • У кода практически нет причин объявлять класс ссылки на объект потока в виде потока file .Код ввода-вывода может использовать InputStream или OutputStteam.Действительно, он должен , как часть программирования для интерфейса, и для того, чтобы позволить дешевое модульное тестирование вашего кода ввода-вывода (позволяя использовать простой поток байтового массива в качестве фиктивного объекта).* Возможно, вы надеетесь использовать имя файла в некоторых сообщениях журнала?Если это так, это говорит о том, что вы пытаетесь регистрировать ошибки ввода-вывода файла слишком низко в вашей программной иерархии.Возможно, вы слишком рано «ловите» IOException, а не позволяете им распространяться на более высокие части вашей программы, которые знают, что IO - это файловый IO, и знают имя файла.
0 голосов
/ 28 февраля 2014

Мой ответ приходит немного поздно.Я столкнулся с той же проблемой при написании некоторого кода.

Чтобы обойти это, я использовал FileOutputStream(File file) вместо FileOutputStream(String location), потому что тогда я могу сделать file.getAbsolutePath().Смотрите пример кода ниже.

String location = "some.relative.path.txt";
File file = new File(location);
FileOutputStream f = new FileOutputStream(file);
String question = "<h3>"+header+"</h3>";
String finalSource = HTMLWrapper.HTML_START+question +htmlContent;
f.write(finalSource.getBytes());
f.flush();
f.close();
System.out.println("The report is now available at"+file.getAbsolutePath());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...