Shortener (9) Напишем еще одну стратегию, назовем ее FileStorageStrategy. Она будет очень похожа на стратегию OurHashMapStorageStrategy, но в качестве ведер (англ. buckets) будут файлы. Я знаю, ты знаешь о каких buckets идет речь, если нет – повтори внутреннее устройство HashMap. 9.1. Создай класс FileBucket в пакете strategy. 9.2. Добавь в класс поле Path path. Это будет путь к файлу. 9.3. Добавь в класс конструктор без параметров, он должен: 9.3.1. Инициализировать path временным файлом. Файл должен быть размещен в директории для временных файлов и иметь случайное имя. Подсказка: Files.createTempFile. 9.3.2. Создавать новый файл, используя path. Если такой файл уже есть, то заменять его. 9.3.3. Обеспечивать удаление файла при выходе из программы. Подсказка: deleteOnExit(). 9.4. Добавь в класс методы: 9.4.1. long getFileSize(), он должен возвращать размер файла на который указывает path. 9.4.2. void putEntry(Entry entry) — должен сериализовывать переданный entry в файл. Учти, каждый entry может содержать еще один entry. 9.4.3. Entry getEntry() — должен забирать entry из файла. Если файл имеет нулевой размер, вернуть null. 9.4.4. void remove() – удалять файл на который указывает path. Конструктор и методы не должны кидать исключения.

Искал повсюду, что может быть не так. Рассмотрел решённый вопрос по поводу задания 9 здесь, но не помогло. Друзья, прошу помощи. (Зачем в услвии говорится, что Учти каждый Ентри может содержать ещё ентри, если всё итак сериализируется нормально вместе со всем содержимым?)

public class FileBucket {
private Path path;

public FileBucket() {
    try {
        path = Files.createTempFile(null, null);
        Files.deleteIfExists(path);
        Files.createFile(path);
    } catch (IOException e) {
        ExceptionHandler.log(e);
    }
    path.toFile().deleteOnExit();
}

public long getFileSize(){
    return path.toFile().length();
}

public void putEntry(Entry entry){
    try {
        OutputStream fos = Files.newOutputStream(path);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(entry);
        oos.flush();
    } catch (IOException e) {
        ExceptionHandler.log(e);
    }

}
public Entry getEntry() {
    Entry result = null;
    if(getFileSize()<=0) return null;

    try {
        InputStream fis = Files.newInputStream(path);
        ObjectInputStream ois = new ObjectInputStream(fis);
        result = (Entry) ois.readObject();
    } catch (IOException e) {
        ExceptionHandler.log(e);
    } catch (ClassNotFoundException e) {
        ExceptionHandler.log(e);
    }
    return result;
}

public void remove(){
    try {
        Files.delete(path);
    } catch (IOException e) {
        ExceptionHandler.log(e);
    }
}

}

задан 20 Мар, 16:01

Andras's gravatar image

Andras
494
одобрено: 50%


Нашёл ответ. Для потомков оставлю тут подсказку. Задачу примет валидатор только в том случае, если размер файла возвращать с помощью Files.size(path).

ссылка

опубликован 20 Мар, 16:41

Andras's gravatar image

Andras
494
одобрено: 50%

Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×3,808
×1,631
×7

Задан: 20 Мар, 16:01

Просмотров: 331 раз

Отредактирован: 20 Мар, 16:41