--- /dev/null 2015-04-26 06:51:08.003313989 -0700 +++ new/jdk/src/jdk.jline/share/classes/jdk/internal/jline/console/history/FileHistory.java 2015-06-18 03:05:22.550938043 -0700 @@ -0,0 +1,107 @@ +/* + * 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 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 jline.internal.Log; + +import static 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); + } + } +} \ No newline at end of file