package vnet.sms.common.shell.springshell.internal.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
/**
* Simple utility methods for file and stream copying. All copy methods use a
* block size of 4096 bytes, and close all affected streams when done.
*
* <p>
* Mainly for use within the framework, but also useful for application code.
*
* @author Juergen Hoeller
* @since 1.0
*/
public final class FileCopyUtils {
public static final int BUFFER_SIZE = 4096;
// ---------------------------------------------------------------------
// Copy methods for java.io.File
// ---------------------------------------------------------------------
/**
* Copy the contents of the given input File to the given output File.
*
* @param in
* the file to copy from
* @param out
* the file to copy to
* @return the number of bytes copied
* @throws IOException
* in case of I/O errors
*/
public static int copy(final File in, final File out) throws IOException {
Assert.notNull(in, "No input File specified");
Assert.notNull(out, "No output File specified");
return copy(new BufferedInputStream(new FileInputStream(in)),
new BufferedOutputStream(new FileOutputStream(out)));
}
/**
* Copy the contents of the given byte array to the given output File.
*
* @param bytes
* the byte array to copy from
* @param file
* the file to copy to
* @throws IOException
* in case of I/O errors
*/
public static void copy(final byte[] bytes, final File file)
throws IOException {
Assert.notNull(bytes, "No input byte array specified");
Assert.notNull(file, "No output File specified");
final ByteArrayInputStream in = new ByteArrayInputStream(bytes);
final OutputStream out = new BufferedOutputStream(new FileOutputStream(
file));
copy(in, out);
}
/**
* Copy the contents of the given input File into a new byte array.
*
* @param in
* the file to copy from
* @return the new byte array that has been copied to
* @throws IOException
* in case of I/O errors
*/
public static byte[] copyToByteArray(final File in) throws IOException {
Assert.notNull(in, "No input File specified");
return copyToByteArray(new BufferedInputStream(new FileInputStream(in)));
}
// ---------------------------------------------------------------------
// Copy methods for java.io.InputStream / java.io.OutputStream
// ---------------------------------------------------------------------
/**
* Copy the contents of the given InputStream to the given OutputStream.
* Closes both streams when done.
*
* @param in
* the stream to copy from
* @param out
* the stream to copy to
* @return the number of bytes copied
* @throws IOException
* in case of I/O errors
*/
public static int copy(InputStream in, OutputStream out) throws IOException {
Assert.notNull(in, "No InputStream specified");
Assert.notNull(out, "No OutputStream specified");
if (!(in instanceof BufferedInputStream)) {
in = new BufferedInputStream(in);
}
if (!(out instanceof BufferedOutputStream)) {
out = new BufferedOutputStream(out);
}
try {
int byteCount = 0;
final byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
byteCount += bytesRead;
}
out.flush();
return byteCount;
} finally {
IOUtils.closeQuietly(in, out);
}
}
/**
* Copy the contents of the given byte array to the given OutputStream.
* Closes the stream when done.
*
* @param bytes
* the byte array to copy from
* @param out
* the OutputStream to copy to
* @throws IOException
* in case of I/O errors
*/
public static void copy(final byte[] bytes, final OutputStream out)
throws IOException {
Assert.notNull(bytes, "No input byte array specified");
Assert.notNull(out, "No OutputStream specified");
try {
out.write(bytes);
} finally {
IOUtils.closeQuietly(out);
}
}
/**
* Copy the contents of the given InputStream into a new byte array. Closes
* the stream when done.
*
* @param in
* the stream to copy from
* @return the new byte array that has been copied to
* @throws IOException
* in case of I/O errors
*/
public static byte[] copyToByteArray(final InputStream in)
throws IOException {
final ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE);
copy(in, out);
return out.toByteArray();
}
// ---------------------------------------------------------------------
// Copy methods for java.io.Reader / java.io.Writer
// ---------------------------------------------------------------------
/**
* Copy the contents of the given Reader to the given Writer. Closes both
* when done.
*
* @param in
* the Reader to copy from
* @param out
* the Writer to copy to
* @return the number of characters copied
* @throws IOException
* in case of I/O errors
*/
public static int copy(Reader in, Writer out) throws IOException {
Assert.notNull(in, "No Reader specified");
Assert.notNull(out, "No Writer specified");
if (!(in instanceof BufferedReader)) {
in = new BufferedReader(in);
}
if (!(out instanceof BufferedWriter)) {
out = new BufferedWriter(out);
}
try {
int byteCount = 0;
final char[] buffer = new char[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
byteCount += bytesRead;
}
out.flush();
return byteCount;
} finally {
IOUtils.closeQuietly(in, out);
}
}
/**
* Copy the contents of the given String to the given output Writer. Closes
* the writer when done.
*
* @param in
* the String to copy from
* @param out
* the Writer to copy to
* @throws IOException
* in case of I/O errors
*/
public static void copy(final String in, Writer out) throws IOException {
Assert.notNull(in, "No input String specified");
Assert.notNull(out, "No Writer specified");
if (!(out instanceof BufferedWriter)) {
out = new BufferedWriter(out);
}
try {
out.write(in);
} finally {
IOUtils.closeQuietly(out);
}
}
/**
* Copy the contents of the given Reader into a String. Closes the reader
* when done.
*
* @param in
* the reader to copy from
* @return the String that has been copied to
* @throws IOException
* in case of I/O errors
*/
public static String copyToString(final Reader in) throws IOException {
final StringWriter out = new StringWriter();
copy(in, out);
return out.toString();
}
/**
* Returns the contents of the given File as a String.
* <p>
* Consider using {@link FileUtils#read(File)} instead if any
* {@link IOException}s would be unrecoverable.
*
* @param file
* the file to read from
* @return the contents
* @throws IOException
* in case of I/O errors
*/
public static String copyToString(final File file) throws IOException {
return copyToString(new BufferedReader(new FileReader(file)));
}
/**
* Constructor is private to prevent instantiation
*/
private FileCopyUtils() {
}
}