blob: 4c3be3e840472bb4a3a81e62277ef21bce87e418 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.utils;
import java.io.*;
import java.net.URL;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
/**
* Utilities for dealing with byte ({@link java.io.InputStream} and
* {@link java.io.OutputStream}) and character ({@link java.io.Reader} and
* {@link java.io.Writer}) streams.
*/
public class StreamUtils {
/** The default size of the byte buffer used in the {@link #copy} methods. */
public static final int DEFAULT_BUFFER_SIZE = 16384;
/**
* Read the contents of the given URL into a byte array.
*
* @param input
* the URL to read
* @return an array of bytes.
* @throws IOException
* in case of I/O error
*/
public static byte[] read(URL input) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(DEFAULT_BUFFER_SIZE);
copy(byteStream, input);
return byteStream.toByteArray();
}
/**
* Read the contents of the given InputStream into a byte array.
*
* @param input
* the InputStream to read
* @return an array of bytes.
* @throws IOException
* in case of I/O error
*/
public static byte[] read(InputStream source) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(DEFAULT_BUFFER_SIZE);
copy(byteStream, source);
return byteStream.toByteArray();
}
/**
* Copy data from an {@link InputStream} to an {@link OutputStream} until an
* end-of-stream is reached on the source {@link InputStream}. This method
* does <em>not</em> attempt to close either the source or the destination
* stream.
*
* @param dest
* destination {@link OutputStream}
* @param source
* source {@link InputStream}
* @param bufSize
* write buffer size
* @throws IOException
* in case of I/O error
*/
public static void copy(OutputStream dest, InputStream source, int bufSize) throws IOException {
byte[] buf = new byte[bufSize];
int read;
while ((read = source.read(buf)) != -1) {
dest.write(buf, 0, read);
}
}
/**
* Copy data from an {@link Reader} to an {@link Writer} until an
* end-of-stream is reached on the source {@link Reader}. This method does
* <em>not</em> attempt to close either the source or the destination
* stream.
*
* @param dest
* destination {@link Writer}
* @param source
* source {@link Reader}
* @param bufSize
* write buffer size
* @throws IOException
* in case of I/O error
*/
public static void copy(Writer dest, Reader source, int bufSize) throws IOException {
char[] buf = new char[bufSize];
int read;
while ((read = source.read(buf)) != -1) {
dest.write(buf, 0, read);
}
}
/**
* Copy with default buffer size.
*
* @see #copy(java.io.OutputStream, java.io.InputStream)
* @see #DEFAULT_BUFFER_SIZE
*/
public static void copy(OutputStream dest, InputStream source) throws IOException {
copy(dest, source, DEFAULT_BUFFER_SIZE);
}
/**
* Copy from {@link URL} stream.
*
* @see #copy(java.io.OutputStream, java.io.InputStream, int)
* @param dest
* destination {@link OutputStream}
* @param source
* source {@link URL}
*/
public static void copy(OutputStream dest, URL source) throws IOException {
InputStream urlStream = source.openStream();
copy(dest, urlStream);
urlStream.close();
}
/**
* Write a {@link Serializable} object to an output stream using the
* {@link ObjectOutputStream} mechanism.
*
* @param dest
* destination {@link OutputStream}
* @param src
* source {@link Serializable}
* @throws IOException
*/
public static void write(OutputStream dest, Serializable src) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(dest);
oos.writeObject(src);
oos.flush();
}
public static Object readObj(InputStream is) throws IOException,ClassNotFoundException {
ObjectInputStream iis = new ObjectInputStream(is);
return iis.readObject();
}
/**
* Expand a Jar input stream.
*/
public static void extractJar(File dest, InputStream is) throws IOException {
JarInputStream jis = new JarInputStream(is);
JarEntry je;
while ((je = jis.getNextJarEntry()) != null) {
File outputFile = new File(dest, je.getName());
if (je.isDirectory()) {
outputFile.mkdirs();
}
else {
outputFile.getParentFile().mkdirs();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputFile));
copy(bos, jis);
bos.flush();
bos.close();
}
jis.closeEntry();
}
}
}