/** * */ package org.gjt.sp.jedit.io; import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import org.gjt.sp.util.IOUtilities; import org.gjt.sp.util.Log; import org.gjt.sp.util.Task; /** * The Task for asynchronous saving local file to disk ommiting VFS API stack. * Can be used to store backup files, settings, etc * * @example * This class used for example by ftp.FtpVFS to perform local backups of remote files in background with no GUI freeze * * @example * ThreadUtilities.runInBackground( new LocalFileSaveTask(...) ) * * @author Vadim Voituk * @since jEdit 4.5pre * * TODO: Add setLabel() && ProgressObserver methods */ public class LocalFileSaveTask extends Task { private static final int BUFFER_SIZE = 4096; private File file; private String body; private String charset; public LocalFileSaveTask(File file, String body, String charset) { this.file = file; this.body = body; this.charset = charset; } /** * @see org.gjt.sp.util.Task#_run() */ @Override public void _run() { FileOutputStream os = null; FileChannel ch = null; try { os = new FileOutputStream(file); ch = os.getChannel(); byte[] src = body.getBytes(charset); os = new FileOutputStream(file); ch = os.getChannel(); ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE); int length = src.length; setMaximum(length); setStatus("Saving " + length + " bytes to " + file.getPath() ); //TODO: Change this int written = 0; while (written < length) { written += ch.write( (ByteBuffer)buff.put(src, written, Math.min(BUFFER_SIZE, length-written) ).flip() ); buff.rewind(); setValue(written); } } catch (IOException e) { Log.log(Log.ERROR, this, e, e); } finally { IOUtilities.closeQuietly((Closeable)ch); IOUtilities.closeQuietly((Closeable)os); } } }