All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.ugli.commons.CopyCommand Maven / Gradle / Ivy

package se.ugli.commons;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.nio.charset.Charset;

public class CopyCommand {

	private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

	public static CopyCommand apply() {
		return new CopyCommand(DEFAULT_BUFFER_SIZE);
	}

	public static CopyCommand apply(final int bufferSize) {
		return new CopyCommand(bufferSize);
	}

	private final int bufferSize;

	private CopyCommand(final int bufferSize) {
		this.bufferSize = bufferSize;
	}

	public void copy(final ReadableByteChannel in, final WritableByteChannel out) {
		try {
			final ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize);
			while (in.read(buffer) != -1 || buffer.position() > 0) {
				buffer.flip();
				out.write(buffer);
				buffer.compact();
			}
		} catch (final IOException e) {
			throw new IoException(e);
		}
	}

	public void copy(final InputStream in, final OutputStream out) {
		try {
			final byte[] buffer = new byte[bufferSize];
			int n = 0;
			while (-1 != (n = in.read(buffer)))
				out.write(buffer, 0, n);
		} catch (final IOException e) {
			throw new IoException(e);
		}
	}

	public void copy(final Reader in, final Charset charset, final OutputStream out) {
		copy(toInputStream(in, charset), out);
	}

	public void copy(final Reader in, final OutputStream out) {
		copy(in, Charset.defaultCharset(), out);
	}

	public byte[] copyToBytes(final InputStream in) {
		ByteArrayOutputStream out = null;
		try {
			out = new ByteArrayOutputStream();
			copy(in, out);
			return out.toByteArray();
		} finally {
			CloseCommand.execute(out);
		}
	}

	public byte[] copyToBytes(final Reader in) {
		return copyToBytes(in, Charset.defaultCharset());
	}

	public byte[] copyToBytes(final Reader in, final Charset charset) {
		return copyToBytes(toInputStream(in, charset));
	}

	public String copyToString(final InputStream in) {
		return copyToString(in, Charset.defaultCharset());
	}

	public String copyToString(final InputStream in, final Charset charset) {
		return new String(copyToBytes(in), charset);
	}

	public String copyToString(final Reader in) {
		return copyToString(in, Charset.defaultCharset(), Charset.defaultCharset());
	}

	public String copyToString(final Reader in, final Charset inCharset, final Charset outCharset) {
		return copyToString(toInputStream(in, inCharset), outCharset);
	}

	private InputStream toInputStream(final Reader reader, final Charset charset) {
		try {
			final char[] charBuffer = new char[bufferSize];
			final StringBuilder builder = new StringBuilder();
			int numCharsRead;
			while ((numCharsRead = reader.read(charBuffer, 0, charBuffer.length)) != -1)
				builder.append(charBuffer, 0, numCharsRead);
			return new ByteArrayInputStream(builder.toString().getBytes(charset));
		} catch (final IOException e) {
			throw new IoException(e);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy