001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.commons.fileupload.util;
018:
019: import java.io.ByteArrayOutputStream;
020: import java.io.IOException;
021: import java.io.InputStream;
022: import java.io.OutputStream;
023:
024: /** Utility class for working with streams.
025: */
026: public final class Streams {
027: /**
028: * Private constructor, to prevent instantiation.
029: * This class has only static methods.
030: */
031: private Streams() {
032: // Does nothing
033: }
034:
035: /**
036: * Default buffer size for use in
037: * {@link #copy(InputStream, OutputStream, boolean)}.
038: */
039: private static final int DEFAULT_BUFFER_SIZE = 8192;
040:
041: /**
042: * Copies the contents of the given {@link InputStream}
043: * to the given {@link OutputStream}. Shortcut for
044: * <pre>
045: * copy(pInputStream, pOutputStream, new byte[8192]);
046: * </pre>
047: * @param pInputStream The input stream, which is being read.
048: * It is guaranteed, that {@link InputStream#close()} is called
049: * on the stream.
050: * @param pOutputStream The output stream, to which data should
051: * be written. May be null, in which case the input streams
052: * contents are simply discarded.
053: * @param pClose True guarantees, that {@link OutputStream#close()}
054: * is called on the stream. False indicates, that only
055: * {@link OutputStream#flush()} should be called finally.
056: *
057: * @return Number of bytes, which have been copied.
058: * @throws IOException An I/O error occurred.
059: */
060: public static long copy(InputStream pInputStream,
061: OutputStream pOutputStream, boolean pClose)
062: throws IOException {
063: return copy(pInputStream, pOutputStream, pClose,
064: new byte[DEFAULT_BUFFER_SIZE]);
065: }
066:
067: /**
068: * Copies the contents of the given {@link InputStream}
069: * to the given {@link OutputStream}.
070: * @param pIn The input stream, which is being read.
071: * It is guaranteed, that {@link InputStream#close()} is called
072: * on the stream.
073: * @param pOut The output stream, to which data should
074: * be written. May be null, in which case the input streams
075: * contents are simply discarded.
076: * @param pClose True guarantees, that {@link OutputStream#close()}
077: * is called on the stream. False indicates, that only
078: * {@link OutputStream#flush()} should be called finally.
079: * @param pBuffer Temporary buffer, which is to be used for
080: * copying data.
081: * @return Number of bytes, which have been copied.
082: * @throws IOException An I/O error occurred.
083: */
084: public static long copy(InputStream pIn, OutputStream pOut,
085: boolean pClose, byte[] pBuffer) throws IOException {
086: OutputStream out = pOut;
087: InputStream in = pIn;
088: try {
089: long total = 0;
090: for (;;) {
091: int res = in.read(pBuffer);
092: if (res == -1) {
093: break;
094: }
095: if (res > 0) {
096: total += res;
097: if (out != null) {
098: out.write(pBuffer, 0, res);
099: }
100: }
101: }
102: if (out != null) {
103: if (pClose) {
104: out.close();
105: } else {
106: out.flush();
107: }
108: out = null;
109: }
110: in.close();
111: in = null;
112: return total;
113: } finally {
114: if (in != null) {
115: try {
116: in.close();
117: } catch (Throwable t) {
118: /* Ignore me */
119: }
120: }
121: if (pClose && out != null) {
122: try {
123: out.close();
124: } catch (Throwable t) {
125: /* Ignore me */
126: }
127: }
128: }
129: }
130:
131: /**
132: * This convenience method allows to read a
133: * {@link org.apache.commons.fileupload.FileItemStream}'s
134: * content into a string. The platform's default character encoding
135: * is used for converting bytes into characters.
136: * @param pStream The input stream to read.
137: * @see #asString(InputStream, String)
138: * @return The streams contents, as a string.
139: * @throws IOException An I/O error occurred.
140: */
141: public static String asString(InputStream pStream)
142: throws IOException {
143: ByteArrayOutputStream baos = new ByteArrayOutputStream();
144: copy(pStream, baos, true);
145: return baos.toString();
146: }
147:
148: /**
149: * This convenience method allows to read a
150: * {@link org.apache.commons.fileupload.FileItemStream}'s
151: * content into a string, using the given character encoding.
152: * @param pStream The input stream to read.
153: * @param pEncoding The character encoding, typically "UTF-8".
154: * @see #asString(InputStream)
155: * @return The streams contents, as a string.
156: * @throws IOException An I/O error occurred.
157: */
158: public static String asString(InputStream pStream, String pEncoding)
159: throws IOException {
160: ByteArrayOutputStream baos = new ByteArrayOutputStream();
161: copy(pStream, baos, true);
162: return baos.toString(pEncoding);
163: }
164: }
|