Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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());