Получить имя файла из FileOutputStream

java io fileoutputstream

44044 просмотра

5 ответа

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

Автор: Ebbu Abraham Источник Размещён: 12.11.2019 09:22

Ответы (5)


32 плюса

Решение

Похоже, ответ нет:
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.

Автор: Tom G Размещён: 08.02.2011 06:12

15 плюса

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

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

Автор: Costi Ciudatu Размещён: 08.02.2011 06:31

12 плюса

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

Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);

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

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

Автор: Hans Deragon Размещён: 06.11.2015 05:35

2 плюса

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

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

  • В коде почти нет причин объявлять класс ссылки на объект потока потоком файлов . Код ввода-вывода может использовать InputStream или OutputStteam. На самом деле, это необходимо , как часть программирования интерфейса, и чтобы позволить дешевое модульное тестирование вашего кода ввода-вывода (путем использования простого потока байтового массива в качестве фиктивного объекта).
  • Возможно, вы надеетесь использовать имя файла в некоторых сообщениях журнала? Если это так, это говорит о том, что вы пытаетесь регистрировать ошибки ввода-вывода файла слишком низко в вашей программной иерархии. Возможно, вы слишком рано «ловите» IOException, вместо того, чтобы позволить им распространяться на более высокие части вашей программы, которые знают, что IO - это файловый IO, и знают имя файла.
Автор: Raedwald Размещён: 20.11.2016 09:26

-1 плюса

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

Чтобы обойти это, я использовал 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());
Автор: David Brossard Размещён: 28.02.2014 08:06
Вопросы из категории :
32x32