Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Если Вы работаете с Сервлетом и если контекст сервлета доступен Вам, можно использовать:
getServletContext().getMimeType( fileName );
К сожалению,
mimeType = file.toURL().openConnection().getContentType();
не работает, поскольку такое использование URL оставляет файл заблокированным, так что, например, его нельзя удалить.
Однако у вас есть это:
mimeType= URLConnection.guessContentTypeFromName(file.getName());
, а также следующее, преимущество которого заключается в том, что оно выходит за рамки простого использования расширения файла, и заглядывает в контент
InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream
. Однако, как указано в комментарии выше, встроенная таблица mime-типов весьма ограничена, не включая, например, MSWord и PDF. Итак, если вы хотите обобщить, вам нужно выйти за рамки встроенных библиотек, используя, например, Mime-Util (отличная библиотека, использующая как расширение файла, так и содержимое).
JAF API является частью JDK 6. Посмотрите на пакет javax.activation
.
Наиболее интересными классами являются javax.activation.MimeType
- фактический держатель типа MIME - и javax.activation.MimetypesFileTypeMap
- класс, экземпляр которого может преобразовывать тип MIME как строку для файла:
String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);
// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);