Путь / имя файла из InputStream - PullRequest
14 голосов
/ 23 марта 2010

Как получить путь к файлу / имя из InputStream в Java?

Ответы [ 3 ]

10 голосов
/ 23 марта 2010

Это невозможно. (не из FileInputStream в Java API). Конструктор FileInputStream не хранит эту информацию ни в одном поле:

public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }
        if (name == null) {
            throw new NullPointerException();
        }
    fd = new FileDescriptor();
    open(name);
    }
9 голосов
/ 23 марта 2010

Вы не можете, потому что InputStream, возможно, не был файлом или путем. Вы можете реализовать свой собственный InputStream, который генерирует данные на лету

4 голосов
/ 22 апреля 2016

Два важных принципа объектно-ориентированного проектирования не позволяют вам делать то, что вы просите: абстракция и инкапсуляция.

  • Абстракция - это процесс определения общей концепции, которая содержит только детали, необходимые для ее использования в конкретном контексте (подробности здесь ). В этой ситуации абстракция - это InputStream, который является общим интерфейсом, который может предоставлять байты, независимо от источника этих байтов . Абстракция InputStream не имеет понятия пути к файлу; это относится только к конкретным реализациям InputStream.
  • Инкапсуляция - это процесс сокрытия деталей реализации класса от потребителей / пользователей этого класса. В этой конкретной ситуации FileInputStream инкапсулирует детали файла, из которого он читает, потому что как InputStream эта информация не имеет отношения к использованию. Поле path instance инкапсулировано и, как таковое, недоступно для пользователей класса.

Сказав это, можно получить доступ к переменной path, если вы готовы принять некоторые важные ограничения. По сути, суть в том, что вы можете проверить, действительно ли InputStream является экземпляром FileInputStream, и, если это так, использовать отражение, чтобы прочитать поле экземпляра path. Я опущу детали этого доступа, так как его легко обнаружить в java.lang.Class Java-документах и ​​в Интернете, и в большинстве случаев это не очень хорошая вещь. Поскольку вопрос не дает контекста о том, почему, трудно предложить более разумные подходы.

...