package org.marketcetera.util.file;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;
import org.marketcetera.util.except.ExceptUtils;
import org.marketcetera.util.except.I18NException;
import org.marketcetera.util.log.I18NBoundMessage1P;
import org.marketcetera.util.log.I18NBoundMessage2P;
import org.marketcetera.util.misc.ClassVersion;
/**
* Utilities for copying binary data. The participating media include
* files, arrays, streams, or some combinations thereof.
*
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: CopyBytesUtils.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
@ClassVersion("$Id: CopyBytesUtils.java 16154 2012-07-14 16:34:05Z colin $")
public final class CopyBytesUtils
{
// CLASS METHODS.
/**
* Copies a byte stream from the given source to the given sink.
*
* @param in The byte source, as interpreted by {@link
* InputStreamWrapper#InputStreamWrapper(InputStream,boolean)}.
* @param inSkipClose True if the source stream should not be
* closed.
* @param out The byte sink, as interpreted by {@link
* OutputStreamWrapper#OutputStreamWrapper(OutputStream,boolean)}.
* @param outSkipClose True if the sink stream should not be
* closed.
*
* @return The number of bytes copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(InputStream in,
boolean inSkipClose,
OutputStream out,
boolean outSkipClose)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
InputStreamWrapper inW=new InputStreamWrapper(in,inSkipClose);
registry.register(inW);
OutputStreamWrapper outW=new OutputStreamWrapper(out,outSkipClose);
registry.register(outW);
return IOUtils.copyLarge(inW.getStream(),outW.getStream());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,Messages.CANNOT_COPY_STREAMS);
} finally {
registry.close();
}
}
/**
* Copies a byte stream from one given location to another.
*
* @param in The name of the byte source, as interpreted by {@link
* InputStreamWrapper#InputStreamWrapper(String)}.
* @param out The name of the byte sink, as interpreted by {@link
* OutputStreamWrapper#OutputStreamWrapper(String)}.
*
* @return The number of bytes copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(String in,
String out)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
InputStreamWrapper inW=new InputStreamWrapper(in);
registry.register(inW);
OutputStreamWrapper outW=new OutputStreamWrapper(out);
registry.register(outW);
return IOUtils.copyLarge(inW.getStream(),outW.getStream());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage2P
(Messages.CANNOT_COPY_FILES,in,out));
} finally {
registry.close();
}
}
/**
* Copies a byte stream from the given source to the given
* location.
*
* @param in The byte source, as interpreted by {@link
* InputStreamWrapper#InputStreamWrapper(InputStream,boolean)}.
* @param skipClose True if the source stream should not be
* closed.
* @param out The name of the byte sink, as interpreted by {@link
* OutputStreamWrapper#OutputStreamWrapper(String)}.
*
* @return The number of bytes copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(InputStream in,
boolean skipClose,
String out)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
InputStreamWrapper inW=new InputStreamWrapper(in,skipClose);
registry.register(inW);
OutputStreamWrapper outW=new OutputStreamWrapper(out);
registry.register(outW);
return IOUtils.copyLarge(inW.getStream(),outW.getStream());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_ISTREAM,out));
} finally {
registry.close();
}
}
/**
* Copies a byte stream from the given location to the given sink.
*
* @param in The name of the byte source, as interpreted by {@link
* InputStreamWrapper#InputStreamWrapper(String)}.
* @param out The byte sink, as interpreted by {@link
* OutputStreamWrapper#OutputStreamWrapper(OutputStream,boolean)}.
* @param skipClose True if the sink stream should not be closed.
*
* @return The number of bytes copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(String in,
OutputStream out,
boolean skipClose)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
InputStreamWrapper inW=new InputStreamWrapper(in);
registry.register(inW);
OutputStreamWrapper outW=new OutputStreamWrapper(out,skipClose);
registry.register(outW);
return IOUtils.copyLarge(inW.getStream(),outW.getStream());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_OSTREAM,in));
} finally {
registry.close();
}
}
/**
* Copies a byte stream from the given location into memory,
* returning a byte array.
*
* @param name The name of the byte source, as interpreted by
* {@link InputStreamWrapper#InputStreamWrapper(String)}.
*
* @return The array.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static byte[] copy
(String name)
throws I18NException
{
try {
InputStreamWrapper inW=new InputStreamWrapper(name);
try {
return IOUtils.toByteArray(inW.getStream());
} finally {
inW.close();
}
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_MEMORY_DST,name));
}
}
/**
* Copies an in-memory byte array into the given location.
*
* @param data The array.
* @param name The name of the byte sink, as interpreted by {@link
* OutputStreamWrapper#OutputStreamWrapper(String)}.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static void copy
(byte[] data,
String name)
throws I18NException
{
try {
OutputStreamWrapper outW=new OutputStreamWrapper(name);
try {
outW.getStream().write(data);
} finally {
outW.close();
}
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_MEMORY_SRC,name));
}
}
// CONSTRUCTOR.
/**
* Constructor. It is private so that no instances can be created.
*/
private CopyBytesUtils() {}
}