Как эффективно управлять файлами в файловой системе на Java? - PullRequest
3 голосов
/ 11 июня 2010

Я создаю несколько конечных точек JAX-WS, для которых я хочу сохранить полученные и отправленные сообщения для последующей проверки. Для этого я планирую сохранить сообщения (файлы XML) в файловой системе в некоторой разумной иерархии. Там будут сотни, даже тысячи файлов в день. Мне также нужно хранить метаданные для каждого файла.

Я планирую поместить метаданные (всего пару полей) в таблицу базы данных, но сам контент файла XML в файлы в файловой системе, чтобы не переполнять базу данных данными контента (которые редко читаются). 1003 *

Есть ли какая-нибудь простая библиотека, которая помогает мне сохранять, загружать, удалять и т. Д. Файлы? Это не так сложно реализовать самостоятельно, но мне интересно, существуют ли уже существующие решения? Просто простая библиотека, которая уже обеспечивает легкий доступ к файловой системе (предпочтительно по сравнению с другими операционными системами).

Или мне это даже нужно, я должен просто перейти на сырую / кастомную Java?

Ответы [ 2 ]

6 голосов
/ 11 июня 2010

Есть ли какая-нибудь простая библиотека, которая помогает мне сохранять, загружать, удалять и т. Д. Файлы?Это не так сложно реализовать самостоятельно, но мне интересно, существуют ли уже существующие решения?Просто простая библиотека, которая уже обеспечивает легкий доступ к файловой системе (предпочтительно по сравнению с другими операционными системами).

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).

0 голосов
/ 22 июня 2010

Существует DataNucleus , поставщик сохраняемости Java.Он немного тяжел для этого случая, но поддерживает стандарты java JPA и JDO с различными хранилищами данных (СУБД, хранилище объектов, XML, JSON, Excel и т. Д.).Если продукт уже использует JPA или JDO, возможно, стоит подумать об использовании NataNucleus, поскольку сохранение данных в разных хранилищах данных должно быть прозрачным.Я предполагаю, что DataNucleus поддерживает разбиение данных на несколько файлов, создавая разумную структуру каталогов / файлов, которую я хотел (в моем вопросе), но это всего лишь предположение.

Поддержка XML и JSON кажется экспериментальной.

...