package org.marketcetera.util.file;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
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 textual data, in the default JVM charset. The
* participating media include files, arrays, readers/writers, or some
* combinations thereof.
*
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: CopyCharsUtils.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
@ClassVersion("$Id: CopyCharsUtils.java 16154 2012-07-14 16:34:05Z colin $")
public final class CopyCharsUtils
{
// CLASS METHODS.
/**
* Copies a character stream from the given source to the given
* sink.
*
* @param in The character source, as interpreted by {@link
* ReaderWrapper#ReaderWrapper(Reader,boolean)}.
* @param inSkipClose True if the source reader should not be
* closed.
* @param out The character sink, as interpreted by {@link
* WriterWrapper#WriterWrapper(Writer,boolean)}.
* @param outSkipClose True if the sink writer should not be
* closed.
*
* @return The number of characters copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(Reader in,
boolean inSkipClose,
Writer out,
boolean outSkipClose)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
ReaderWrapper inW=new ReaderWrapper(in,inSkipClose);
registry.register(inW);
WriterWrapper outW=new WriterWrapper(out,outSkipClose);
registry.register(outW);
return IOUtils.copyLarge(inW.getReader(),outW.getWriter());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,Messages.CANNOT_COPY_CSTREAMS);
} finally {
registry.close();
}
}
/**
* Copies a character stream from one given location to another.
*
* @param in The name of the character source, as interpreted by
* {@link ReaderWrapper#ReaderWrapper(String)}.
* @param out The name of the character sink, as interpreted by
* {@link WriterWrapper#WriterWrapper(String)}.
*
* @return The number of characters 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 {
ReaderWrapper inW=new ReaderWrapper(in);
registry.register(inW);
WriterWrapper outW=new WriterWrapper(out);
registry.register(outW);
return IOUtils.copyLarge(inW.getReader(),outW.getWriter());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage2P
(Messages.CANNOT_COPY_FILES,in,out));
} finally {
registry.close();
}
}
/**
* Copies a character stream from the given source to the given
* location.
*
* @param in The character source, as interpreted by {@link
* ReaderWrapper#ReaderWrapper(Reader,boolean)}.
* @param skipClose True if the source reader should not be
* closed.
* @param out The name of the character sink, as interpreted by
* {@link WriterWrapper#WriterWrapper(String)}.
*
* @return The number of characters copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(Reader in,
boolean skipClose,
String out)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
ReaderWrapper inW=new ReaderWrapper(in,skipClose);
registry.register(inW);
WriterWrapper outW=new WriterWrapper(out);
registry.register(outW);
return IOUtils.copyLarge(inW.getReader(),outW.getWriter());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_READER,out));
} finally {
registry.close();
}
}
/**
* Copies a character stream from the given location to the given
* sink.
*
* @param in The name of the character source, as interpreted by {@link
* ReaderWrapper#ReaderWrapper(String)}.
* @param out The character sink, as interpreted by {@link
* WriterWrapper#WriterWrapper(Writer,boolean)}.
* @param skipClose True if the sink writer should not be closed.
*
* @return The number of characters copied.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static long copy
(String in,
Writer out,
boolean skipClose)
throws I18NException
{
CloseableRegistry registry=new CloseableRegistry();
try {
ReaderWrapper inW=new ReaderWrapper(in);
registry.register(inW);
WriterWrapper outW=new WriterWrapper(out,skipClose);
registry.register(outW);
return IOUtils.copyLarge(inW.getReader(),outW.getWriter());
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_WRITER,in));
} finally {
registry.close();
}
}
/**
* Copies the character stream at the given location into memory,
* returning a character array.
*
* @param name The name of the character source, as interpreted by
* {@link ReaderWrapper#ReaderWrapper(String)}.
*
* @return The array.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static char[] copy
(String name)
throws I18NException
{
try {
ReaderWrapper inW=new ReaderWrapper(name);
try {
return IOUtils.toCharArray(inW.getReader());
} finally {
inW.close();
}
} catch (IOException ex) {
throw ExceptUtils.wrap(ex,new I18NBoundMessage1P
(Messages.CANNOT_COPY_MEMORY_DST,name));
}
}
/**
* Copies an in-memory character array into the given location.
*
* @param data The array.
* @param name The name of the character sink, as interpreted by
* {@link WriterWrapper#WriterWrapper(String)}.
*
* @throws I18NException Thrown if there is a data read/write
* error.
*/
public static void copy
(char[] data,
String name)
throws I18NException
{
try {
WriterWrapper outW=new WriterWrapper(name);
try {
outW.getWriter().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 CopyCharsUtils() {}
}