Есть ли способ получить имя файла из FileOutputStream
или из FileInputStream
?
Получить имя файла из FileOutputStream
Ответ 1
Похоже, ответ отрицательный: 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
, используемые при построении потока.
EDIT: То же самое относится к FileInputStream
.
Ответ 2
Эта функция не предоставляется готовым файловым вводом/выводом-потоком, но ничто не мешает вам писать собственный подкласс, в котором хранится файл (или имя_файла), и предоставляется для него получатель.
Я бы предложил реализовать для этого интерфейс FileNameAware
), поскольку потоки ввода-вывода обычно ссылаются на абстрактные классы InputStream
/OutputStream
, чтобы избежать связывания приложения с конкретными реализациями.
Ответ 3
Возможно, с рефлексией: ответ Тома G правильный, то есть нет API для получения пути. Однако, если вы застряли как я с каркасом, вы не можете изменить и не можете получить имя файла любым другим средним значением, вы можете использовать отражение, чтобы получить путь (в моем случае мне это нужно для целей отладки).
Field pathField = FileOutputStream.class.getDeclaredField("path");
pathField.setAccessible(true);
String path = (String) pathField.get(outputStream);
Очевидно, что реализация FileOutpuStream может со временем меняться, и этот код может сломаться. Кроме того, я пропустил обработку исключений в фрагменте выше для ясности.
Недоступно в версиях 1.6 и 1.7 Подтверждено в 1.8.
Ответ 4
Это невозможно, даже в принципе. Предполагается, что каждый поток ввода файла связан с одним файлом с одним именем. Последнее предположение неверно, для POSIX-систем. Для POSIX-систем файл может иметь любое количество имен (жестких ссылок), включая ноль. Случай с нулевыми именами довольно распространен для временных файлов, чтобы гарантировать, что временный файл будет удален при выходе из программы.
Я написал много файлов ввода-вывода и никогда не нуждался в этой функции. То, что вы просите об этом, говорит о наличии недостатка в дизайне. То есть у вас есть проблема XY.
- Практически нет причин для того, чтобы код объявлял класс ссылки на объект потока как файловый поток. Код ввода-вывода может использовать InputStream или OutputStteam. В самом деле, он должен, как часть программирования для интерфейса, и для обеспечения недорогой модульной проверки вашего кода ввода-вывода (путем использования простого потока байтового массива как макетного объекта).
- Возможно, вы надеетесь использовать имя файла в некоторых сообщениях журнала? Если это так, это говорит о том, что вы пытаетесь слишком долго регистрировать ошибки ввода-вывода в иерархии программ. Возможно, вы слишком рано ловите IOExceptions, а не позволяете им распространяться на более высокие части вашей программы, которые знают, что IO является файлом IO и знает имя файла.
Ответ 5
Мой ответ приходит немного позже. Я столкнулся с той же проблемой при написании кода.
Чтобы обойти это, я использовал 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());