/* * 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.wicket.util.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.net.URL; import java.net.URLConnection; import java.util.Properties; import org.apache.wicket.util.lang.Args; /** * Utilities methods for working with input and output streams. * * @author Jonathan Locke * @author Igor Vaynberg */ public final class Streams { /** * Writes the input stream to the output stream. Input is done without a Reader object, meaning * that the input is copied in its raw form. After it is copied it will close the streams. * * @param in * The input stream * @param out * The output stream * @return Number of bytes copied from one stream to the other * @throws IOException */ public static int copyAndClose(final InputStream in, final OutputStream out) throws IOException { try { return copy(in, out); } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); } } /** * Writes the input stream to the output stream. Input is done without a Reader object, meaning * that the input is copied in its raw form. * * @param in * The input stream * @param out * The output stream * @return Number of bytes copied from one stream to the other * @throws IOException */ public static int copy(final InputStream in, final OutputStream out) throws IOException { return copy(in, out, 4096); } /** * Writes the input stream to the output stream. Input is done without a Reader object, meaning * that the input is copied in its raw form. * * @param in * The input stream * @param out * The output stream * @param bufSize * The buffer size. A good value is 4096. * @return Number of bytes copied from one stream to the other * @throws IOException */ public static int copy(final InputStream in, final OutputStream out, final int bufSize) throws IOException { if (bufSize <= 0) { throw new IllegalArgumentException("The parameter 'bufSize' must not be <= 0"); } final byte[] buffer = new byte[bufSize]; int bytesCopied = 0; while (true) { int byteCount = in.read(buffer, 0, buffer.length); if (byteCount <= 0) { break; } out.write(buffer, 0, byteCount); bytesCopied += byteCount; } return bytesCopied; } /** * Loads properties from an XML input stream into the provided properties object. * * @param properties * The object to load the properties into * @param inputStream * @throws IOException * When the input stream could not be read from */ public static void loadFromXml(final Properties properties, final InputStream inputStream) throws IOException { if (properties == null) { throw new IllegalArgumentException("properties must not be null"); } if (inputStream == null) { throw new IllegalArgumentException("inputStream must not be null"); } properties.loadFromXML(inputStream); } /** * Sets the connection to a URL as non-caching and returns the input stream. * * @param url * the url to read from * @return the input stream for this url * @throws IOException when a connection cannot be opened */ public static InputStream readNonCaching(final URL url) throws IOException { Args.notNull(url, "url"); URLConnection urlConnection = url.openConnection(); urlConnection.setUseCaches(false); InputStream inputStream = urlConnection.getInputStream(); return inputStream; } /** * Reads a stream as a string. * * @param in * The input stream * @return The string * @throws IOException */ public static String readString(final InputStream in) throws IOException { return readString(new BufferedReader(new InputStreamReader(in))); } /** * Reads a string using a character encoding. * * @param in * The input * @param encoding * The character encoding of the input data * @return The string * @throws IOException */ public static String readString(final InputStream in, final CharSequence encoding) throws IOException { return readString(new BufferedReader(new InputStreamReader(in, encoding.toString()))); } /** * Reads all input from a reader into a string. * * @param in * The input * @return The string * @throws IOException */ public static String readString(final Reader in) throws IOException { final StringBuilder buffer = new StringBuilder(2048); int value; while ((value = in.read()) != -1) { buffer.append((char)value); } return buffer.toString(); } /** * Private to prevent instantiation. */ private Streams() { } }