Java: соглашения InputStream для доступности данных, закрытого состояния и т. Д. - PullRequest
1 голос
/ 13 ноября 2011

У меня есть InputStream, настроенный для обработки локальных файлов, но я хочу добавить возможность чтения из файла по сети позднее. Я предполагаю, что InputStream уже предназначен для этого.

Проблема, с которой я столкнулся, заключается в том, что InputStream не гарантирует, что данные будут доступны в любой момент времени, и данные могут стать доступными позже. Не уверен, что я правильно понимаю. Нет способа определить абсолютный размер доступных данных (в виде количества байтов) или даже если InputStream закрыт. Кажется, что если там есть файл, он должен иметь что-то доступное. Метод, который обрабатывает InputStream, вероятно, будет читать из него, и, если нет доступных данных, нет никаких причин его хранить. Что еще хуже, я даже не могу сказать, есть ли какие-либо доступные данные.

Итак, мой вопрос: для файла, считываемого по сети или локально, как я могу определить, открыт ли он или закрыт, и, возможно, определить размер файла на другом конце? Почему этот класс такой голый?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2011

Абстрактный класс InputStream предназначен для чтения байтов из любого источника, а не только из файла.Его потомки предоставляют методы для конкретных источников.Например, FileInputStream может использоваться для чтения байтов из файла, в то время как SocketInputStream используется для чтения байтов из сокета.

Именно поэтому InputStream не предлагает никаких методов для определенияразмер файла, потому что он не имеет смысла для источников, кроме файлов.

Я не уверен, что именно вы подразумеваете под чтением файла по сети.Если это означает чтение файла из удаленной файловой системы (например, через NFS), то вы можете использовать метод length() в классе File, чтобы получить размер файла:

File file = new File("/path/to/file");
System.out.println(file.length());

Вы можетеопределить, является ли FileInputStream открытым или нет, используя метод valid() в экземпляре FileDescriptor, полученном путем вызова метода getFD() в объекте FileInputStream:Имейте в виду, что применяется Закон Утечки Абстракций .

1 голос
/ 13 ноября 2011

java.io.Inputstream делает одно и только одно. Он предоставляет интерфейс для чтения байтов данных из ... чего угодно. Это может быть файл, веб-сайт HTPP, база данных, все, что решено предоставить InputStream. Как таковой, он голый именно потому, что эта простота делает его универсальным. Например, InputStream может использоваться для потокового телевидения. В этом случае длина контента отсутствует, так как вы можете транслироваться вечно. Таким образом, если InputStream предоставит длинную функцию содержимого, он станет бесполезным для бесконечных потоков.

В конце концов, вам придется использовать технологию на шаг впереди входного потока для определения таких вещей, как существование. Например, используйте File.exists для существования файла, найдите ошибку 404 для отсутствия HTTP или исключение базы данных для отсутствия базы данных. Обращайтесь к Inputstream только тогда, когда вы хотите прочитать байты из файла, потому что это все, что он должен делать. Не больше, не меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...