Оставляя в стороне данные абстракции языка - это данные, а не ArrayList<SensorWhatever>
. Это просто цифры. С ним вы можете делать все, что захотите, и можете использовать любое представление данных, которое вам нравится. Более читабельный, например, csv, xml или бинарный. Я лично использовал csv как способ обмена данными между электронной таблицей и процессорной программой, поскольку было очень просто читать / писать и общаться между этими объектами.
Простой способ может выглядеть следующим образом: (скажем, ;
это разделитель, вы можете использовать все, что вы хотите - ,
\t
являются наиболее популярными)
date; time; sensor-id; data1; data2; ...; dataN
2020.01.06; 12.00.00; gyro; 1.1234; 9.9999; 3.3333
2020.01.06; 12.00.00; acc; 0.0020; -0.0987; 9.80665
2020.01.06; 12.00.00; mag; 11.223; -34.567; 13.13
2020.01.06; 12.01.00; gyro; 0.0011; 0.9999; 3.3333
2020.01.06; 12.01.00; acc; 0.2468; 0.0001; 9.80666
2020.01.06; 12.01.00; mag; 11.2233; 44.5566; 77.8899
и затем добавить его в файл журнала. Затем вы можете создавать новый журнал каждый следующий день или в любой другой промежуток времени, в котором вам не нужно исчерпывать память, и все. Синтаксический анализ обратно также прост - вы читаете строку за строкой, разделенную на разделитель, и интерпретируете строки. Не очень сложно.
Или xml, что модно, но сделает журнал намного больше, и вам понадобится парсер xml для его обработки. В обе стороны. Определенно, больше работы.
Если вы выберете двоичную форму, вы можете создать структуру, заполнить ее данными, а затем сохранить как она есть в двоичной форме. Если ваш массив данных имеет или может иметь значение c (с фиксированным числом полей), то ваша задача проста, если он динамический c, тогда у вас будет много проблем с его анализом. Тогда текстовый вариант будет более разумным. Двоичная база данных будет меньше и ее будет легко анализировать, если stati c. Dynami c - это другое дело.