Есть ли какая-нибудь простая библиотека, которая помогает мне сохранять, загружать, удалять и т. Д. Файлы?Это не так сложно реализовать самостоятельно, но мне интересно, существуют ли уже существующие решения?Просто простая библиотека, которая уже обеспечивает легкий доступ к файловой системе (предпочтительно по сравнению с другими операционными системами).
Java API
Хорошо, если вам нужно сделатьэто действительно просто, вы должны быть в состоянии достичь своей цели с помощью java.io.File (удаление, проверка существования, чтение, запись и т. д.) и нескольких потоковых манипуляций с помощью FileInputStream и FileOutputStream .
Вы также можете добавить в Apache commons-io и его удобный FileUtils для нескольких дополнительных служебных функций.
Java не зависит от ОС,Вам просто нужно убедиться, что вы используете File.pathSeparator
или конструктор File(File parent, String child)
, чтобы вам не нужно было явно указывать разделитель.
Файловый API Java является относительно высокоуровневым, чтобы абстрагировать различия многих ОС.В большинстве случаев этого достаточно.Он имеет некоторые недостатки только в том случае, если вам нужна относительно специфическая для ОС функция, которой нет в API, например, проверьте физический размер файла на диске (не логический размер), права безопасности на * nix, свободное место / квотажесткого диска и т. д.
Большинство ОС имеют внутренний буфер для записи / чтения файлов.Использование FileOutputStream.write
и FileOutputStream.flush
гарантирует, что данные были отправлены в ОС, но не обязательно записаны на диск.Java API также поддерживает эту низкоуровневую интеграцию для управления этой проблемой буферизации (пример здесь ) для системы, такой как база данных.
Также и файл, и каталог абстрагируются с помощью File
, и вынужно проверить с isDirectory
.Это может сбивать с толку, например, если у вас есть один файл x
и один каталог /x
(я точно не помню, как решить эту проблему, но есть способ).
Веб-сервис
Веб-сервис может использовать либо xs:base64Binary
для передачи данных, либо использовать MTOM (механизм оптимизации передачи сообщений), если файлы большие.
Транзакции
Обратите внимание, что база данных является транзакционной, а файловая система - нет.Поэтому вам, возможно, придется добавить несколько проверок, если операции завершаются неудачно и повторяются.
Вы можете пойти со сложным дизайном, включающим некоторую форму распределенной транзакции (см. Этот ответ ), или попробовать перейти к более простому дизайну, который обеспечивает требуемый уровень надежности.Возможный дизайн может быть:
- Обновление .Если пользователь хочет перезаписать файл, вы фактически создаете новый.Уровень косвенности между логическим именем файла и физическим файлом сохраняется в базе данных.Таким образом, вы никогда не перезаписываете физический файл после записи, чтобы обеспечить откат согласования.
- Создать .Та же история, когда пользователь хочет создать файл
- Удалить .Если пользователь хочет удалить файл, вы сначала делаете это только в базе данных.Периодическое задание опрашивает файловую систему, чтобы определить файлы, которых нет в базе данных, и удаляет их.Это двухфазное удаление гарантирует, что операция удаления может быть отменена.
Это не так надежно, как запись BLOB в реальной транзакционной базе данных, но обеспечивает некоторую надежность.В противном случае вы могли бы взглянуть на commons -action , но я чувствую, что проект мертв (2007).