Какой самый простой способ иметь пользовательскую реализацию файла, которая использует только память в Java - PullRequest
1 голос
/ 30 апреля 2009

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

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

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

Ответы [ 4 ]

3 голосов
/ 30 апреля 2009

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

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

1 голос
/ 30 апреля 2009

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

0 голосов
/ 30 апреля 2009

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

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

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

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

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
0 голосов
/ 30 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...