/* * Copyright (c) 2002-2012, the original author or authors. * * This software is distributable under the BSD license. See the terms of the * BSD license in the documentation provided with this software. * * http://www.opensource.org/licenses/bsd-license.php */ package jdk.internal.jline.console.history; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.Flushable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.Reader; import jdk.internal.jline.internal.Log; import static jdk.internal.jline.internal.Preconditions.checkNotNull; /** * {@link History} using a file for persistent backing. *

* Implementers should install shutdown hook to call {@link FileHistory#flush} * to save history to disk. * * @author Jason Dillon * @since 2.0 */ public class FileHistory extends MemoryHistory implements PersistentHistory, Flushable { private final File file; public FileHistory(final File file) throws IOException { this.file = checkNotNull(file); load(file); } public File getFile() { return file; } public void load(final File file) throws IOException { checkNotNull(file); if (file.exists()) { Log.trace("Loading history from: ", file); load(new FileReader(file)); } } public void load(final InputStream input) throws IOException { checkNotNull(input); load(new InputStreamReader(input)); } public void load(final Reader reader) throws IOException { checkNotNull(reader); BufferedReader input = new BufferedReader(reader); String item; while ((item = input.readLine()) != null) { internalAdd(item); } } public void flush() throws IOException { Log.trace("Flushing history"); if (!file.exists()) { File dir = file.getParentFile(); if (!dir.exists() && !dir.mkdirs()) { Log.warn("Failed to create directory: ", dir); } if (!file.createNewFile()) { Log.warn("Failed to create file: ", file); } } PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(file))); try { for (Entry entry : this) { out.println(entry.value()); } } finally { out.close(); } } public void purge() throws IOException { Log.trace("Purging history"); clear(); if (!file.delete()) { Log.warn("Failed to delete history file: ", file); } } }