2013-05-31 4 views
1

У меня есть фрагмент кода, который извлекает файл с удаленного сервера или с локального диска.Чтение файла с использованием FileInputStream vs URLConnection

Я понимаю, что URLConnection может обрабатывать оба случая, поэтому мне было интересно, есть ли какое-либо преимущество производительности, если я FileInputStream читать локальный файл, а не просто передав его в URLConnection читать с диска?

ответ

2

Нет, преимущество использования FileInputStream не превышает URLConnection (ну, если вы не подсчитываете миллисекунды нескольких дополнительных вызовов метода).

Чтение файла через URL-адрес file:// в конечном итоге получает вас FileURLConnection (обратите внимание, что это не часть официальной спецификации библиотеки Java, а только JRE на основе Sun). Если вы посмотрите на код, вы увидите, что он создает FileInputStream для работы с файлом на диске. Так что, кроме прохода нескольких слоев дальше в стеке, код заканчивается точно так же.

Причина, по которой вы хотите использовать FileInputStream, является для ясности вашего кода. Включение пути к файлу в URL-адресе немного уродливое, и было бы сложно сделать это, если бы вы только когда-либо работали с файлами.

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

+0

Спасибо за подробный технический ответ о том, как он работает под капотом! Да, в настоящее время модуль настроен на прием URL-адресов, поэтому ему не нужно знать, где находится файл. – user1941747

0

FileInputStream получает входные байты из файла в файловой системе. FileInputStream предназначен для чтения потоков необработанных байтов, таких как данные изображения.

FileReader предназначен для чтения потоков символов.

В общем, создавая соединение с URL является многоступенчатым процессом:

  1. Объект подключения создается путем вызова метода OpenConnection на URL.
  2. Применяются параметры настройки и общие свойства запроса.
  3. Фактическое подключение к удаленному объекту осуществляется с использованием метода подключения.
  4. Удаленный объект становится доступным. Поля заголовка и содержимое удаленного объекта могут быть доступны.

Я думаю, что хорошее эмпирическое правило - использовать простейший код (объект), чтобы оставаться наиболее эффективным. Подумайте, минималистский!

P.S. Не уверен, что вы просто перемещаете файл или читаете его содержимое.

+0

Согласен с идеей минимализма. Дело в том, что ресурс выбирается высоко над стеком, поэтому вместо того, чтобы обертывать передачу некоторой метаинформации на тип ресурса вниз по стеку, изменение его на URL и отправка его вниз по стеку в код будет проще. – user1941747

Смежные вопросы