Каков самый простой способ создать пользовательскую файловую реализацию, которая использует память только в Java

StackOverflow https://stackoverflow.com/questions/804814

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть база кода, которая широко использует файлы для представления одного объекта данных.Я реорганизовал код таким образом, что объект данных теперь является явным объектом java, который в основном скрывает взаимодействие с базовой файловой системой.Однако мы используем несколько внешних инструментов (таких как Weka), которые читают и записывают файлы.

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

Мои поиски в Google выявили файлы с отображением в памяти, но это не та проблема, с которой я сталкиваюсь, поскольку мне не нужен какой-либо реальный файл в файловой системе.Есть ли уже какие-либо решения, или я должен просто сам создать подкласс File и переопределить все методы, которые ссылаются на реальную файловую систему?

Это было полезно?

Решение

Обычно именно поэтому вам никогда не следует писать методы для получения файла, если это действительно не необходимо.Разве ваши библиотеки не предоставляют методы, которые принимают произвольный входной поток?В этом случае тривиально передать ByteArrayInputStream или любой другой входной поток, который считывает данные из памяти.

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

Другие советы

java.io.File по сути, это обертка вокруг String которые представляют путь к файлу (это должен был быть final класс, но не тут-то было).Так что вам не повезло с таким подходом.Вы можете, конечно, создавать временные файлы и архивы на "дисках оперативной памяти".

вам скорее следует обратить внимание на реализацию OutputStreams / InputStreams в памяти, такую как ByteArrayOutputStream с помощью своего метода toByteArray(), или ByteArrayInputStream с помощью конструктора byte[].если ваши данные представлены более сложно, вы могли бы реализовать интерфейс напрямую.

Вы должны выяснить, какие файловые методы используются вашей третьей стороной, и предоставить для них пользовательскую реализацию.

Почти уверен, что вы не сможете добиться успеха, потому что объект java.io.File не отвечает за чтение / запись содержимого файла.

Лучшим подходом было бы реорганизовать код, чтобы он зависел не от объекта File, а от массива байтов, возвращаемого этим файлом.

Возможно создание подкласса file.

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top