/** * */ package edu.berkeley.nlp.util; import java.io.File; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import edu.berkeley.nlp.util.Logger; /** * @author dburkett * */ public class ObjectWriter<T extends Serializable> { private final File folder; private final String baseFilename; private final int objectsPerFile; private final boolean overwrite; private int forestsWritten = 0; private ObjectOutputStream currentOutputStream = null; public ObjectWriter(File folder, String baseFilename, int objectsPerFile, boolean overwrite) { this.folder = folder; this.baseFilename = baseFilename; this.objectsPerFile = objectsPerFile; this.overwrite = overwrite; if (folder.exists() && !folder.isDirectory()) { if (overwrite) { if (!folder.delete()) { throw new IllegalArgumentException("Cannot remove file: " + folder); } } else { throw new IllegalArgumentException("File already exists: " + folder); } } if (!folder.exists() && !folder.mkdir()) { throw new IllegalArgumentException("Cannot create directory: " + folder); } } public void writeObject(T object) { try { if (currentOutputStream == null) { openOutputStream(); } currentOutputStream.writeBoolean(true); currentOutputStream.writeObject(object); forestsWritten++; if (forestsWritten % objectsPerFile == 0) { closeOutputStream(); } } catch(IOException e) { Logger.err("Error writing forest: " + e); } } private void openOutputStream() throws IOException { int fileIndex = forestsWritten / objectsPerFile; File outputFile = new File(folder, baseFilename.replace(".", pad(fileIndex, 4)+".")); if (outputFile.exists()) { if (overwrite) { if (!outputFile.delete()) { throw new IOException("Cannot delete file: " + outputFile); } } else { throw new IOException("File already exists: " + outputFile); } } currentOutputStream = IOUtils.openObjOut(outputFile); } private String pad(int val, int length) { String s = new Integer(val).toString(); for (int i=s.length(); i<length; i++) { s = "0" + s; } return s; } public void closeOutputStream() { if (currentOutputStream == null) return; try { currentOutputStream.writeBoolean(false); currentOutputStream.close(); currentOutputStream = null; } catch(IOException e) { Logger.err("Error closing output stream: " + e); } } }