I/O streams. Working with files. Serialization, buffering and working with ZIP
В данном репозитории реализовано 3 задачи(ссылки на код):
Код по ссылке
- В папке Games создайте несколько директорий:
src
,res
,savegames
,temp
. - В каталоге src создайте две директории:
main
,test
. - В подкаталоге main создайте два файла:
Main.java
,Utils.java
. - В каталог res создайте три директории:
drawables
,vectors
,icons
. - В директории temp создайте файл
temp.txt
. Файлtemp.txt
будет использован для записиси в него информации об успешноном или неуспешном создании файлов и директорий.
Создание директорий осуществлено с помощью метода класса File
mkdir()
, который создаёт новую директорию по указанному в качестве аргумента метода пути.
Создание файлов осущественно с использованием метода createNewFile()
, которому так же передаётся полный путь создаваемого файла.
Осуществляется создание файла внутри блока try-catch
, так как метод createNewFile()
может пробросить исключение, если путь к файлу будет некорректен.
Результат каждой операции заносится в переменную output
типа StringBuilder
с помощью метода apppend()
, в который мы передаём результат.
Запись в файл данной результирующей строки output
осуществляется с использованием объекта класса FileWriter
,
с помощью методов write()
и append()
, определенных в базовом классе Writer
, производится запись данных. Метод flush()
дозаписывает буфер и очищает его.
Это всё осуществляется в блоке try-catch
с ресурсами(в качестве ресурса объект класса FileWriter
- writer
,
конструктору которого передаётся путь(полное наименование файла) для записи и false
для метода append()
, чтобы запись в файла шла сначала).
Код по ссылке
- Создать три экземпляра класса
GameProgress
. - Сохранить сериализованные объекты
GameProgress
в папкуsavegames
из предыдущей задачи. - Созданные файлы сохранений из папки
savegames
запаковать в архив zip. - Удалить файлы сохранений, лежащие вне архива.
Метод saveGame()
, принимающий в качестве аргументов полный путь к файлу типа String
и объект класса GameProgress
, состояние которого нужно сохранить в файл.
Для записи используются такие классы как FileOutputStream
и ObjectOutputStream
.
У последнего есть метод writeObject()
, подходящий для записи сериализованного объекта. Во избежание утечек памяти используется try
с ресурсами.
Таким образом, вызов метода saveGame()
приводит к созданию файлов сохранений в папке savegames
.
Метод zipFiles()
, принимающий в качестве аргументов String
полный путь к файлу архива и список запаковываемых объектов в виде списка строчек String
полного пути к файлу.
В методе реализован блок try-catch
с объектами ZipOutputStream
и FileOutputStream
.
Внутри него пробегаемся по списку файлов и для каждого организуем запись в блоке try-catch
через FileInputStream
.
Для этого создаётся экземпляр ZipEntry
и уведомляем ZipOutputStream
о новом элементе архива с помощью метода putNextEntry()
.
Далее считываем упаковываемый файл с помощью метода read()
и записываем его с помощью метода write()
.
После чего уведомляется ZipOutputStream
о записи файла в архив с помощью метода closeEntry()
.
Далее, используя методы класса File
, удаляем файлы сохранений, не лежащие в архиве.
Код по ссылке
- Произвести распаковку архива в папке savegames.
- Произвести считывание и десериализацию одного из разархивированных файлов save.dat.
- Вывести в консоль состояние сохранненой игры.
Метод openZip()
, который принимает два аргумента: путь к файлу типа String
и путь к папке, куда стоит разархивировать файлы типа String
.
Для распаковки используются такие стримовые классы как FileInputStream
, ZipInputStream
и класс объекта архива ZipEntry
.
Считывание элементов архива производится с помощью метода getNextEntry()
класса ZipInputStream
, а узнаём название объекта ZipEntry
с помощью метода getName()
.
Запись в файл распакованных объектов произведена с помощью FileOutputStream
.
Метод openProgress()
, который в качестве аргумента принимает путь к файлу с сохраненной игрой типа String
и возвращает объект типа GameProgress
.
В данном методе требуются классы FileInputStream
и ObjectInputStream
.
С помощью метода класса ObjectInputStream
readObject()
можно десериализовать объект, а далее привести (скастить) его к GameProgress
.