All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.compress.utils.IOUtils Maven / Gradle / Ivy

Go to download

Apache Commons Compress defines an API for working with compression and archive formats. These include bzip2, gzip, pack200, LZMA, XZ, Snappy, traditional Unix Compress, DEFLATE, DEFLATE64, LZ4, Brotli, Zstandard and ar, cpio, jar, tar, zip, dump, 7z, arj.

There is a newer version: 1.9
Show newest version
/*
 * 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.commons.compress.utils;

import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Utility functions
 * @Immutable (has mutable data but it is write-only)
 */
public final class IOUtils {

    private static final int COPY_BUF_SIZE = 8024;
    private static final int SKIP_BUF_SIZE = 4096;
    
    // This buffer does not need to be synchronised because it is write only; the contents are ignored
    // Does not affect Immutability
    private static final byte[] SKIP_BUF = new byte[SKIP_BUF_SIZE];

    /** Private constructor to prevent instantiation of this utility class. */
    private IOUtils(){
    }

    /**
     * Copies the content of a InputStream into an OutputStream.
     * Uses a default buffer size of 8024 bytes.
     *
     * @param input
     *            the InputStream to copy
     * @param output
     *            the target Stream
     * @return the number of bytes copied
     * @throws IOException
     *             if an error occurs
     */
    public static long copy(final InputStream input, final OutputStream output) throws IOException {
        return copy(input, output, COPY_BUF_SIZE);
    }

    /**
     * Copies the content of a InputStream into an OutputStream
     *
     * @param input
     *            the InputStream to copy
     * @param output
     *            the target Stream
     * @param buffersize
     *            the buffer size to use
     * @return the number of bytes copied
     * @throws IOException
     *             if an error occurs
     */
    public static long copy(final InputStream input, final OutputStream output, final int buffersize) throws IOException {
        final byte[] buffer = new byte[buffersize];
        int n = 0;
        long count=0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
    
    /**
     * Skips the given number of bytes by repeatedly invoking skip on
     * the given input stream if necessary.
     *
     * 

In a case where the stream's skip() method returns 0 before * the requested number of bytes has been skip this implementation * will fall back to using the read() method.

* *

This method will only skip less than the requested number of * bytes if the end of the input stream has been reached.

* * @param input stream to skip bytes in * @param numToSkip the number of bytes to skip * @return the number of bytes actually skipped * @throws IOException on error */ public static long skip(final InputStream input, long numToSkip) throws IOException { final long available = numToSkip; while (numToSkip > 0) { final long skipped = input.skip(numToSkip); if (skipped == 0) { break; } numToSkip -= skipped; } while (numToSkip > 0) { final int read = readFully(input, SKIP_BUF, 0, (int) Math.min(numToSkip, SKIP_BUF_SIZE)); if (read < 1) { break; } numToSkip -= read; } return available - numToSkip; } /** * Reads as much from input as possible to fill the given array. * *

This method may invoke read repeatedly to fill the array and * only read less bytes than the length of the array if the end of * the stream has been reached.

* * @param input stream to read from * @param b buffer to fill * @return the number of bytes actually read * @throws IOException on error */ public static int readFully(final InputStream input, final byte[] b) throws IOException { return readFully(input, b, 0, b.length); } /** * Reads as much from input as possible to fill the given array * with the given amount of bytes. * *

This method may invoke read repeatedly to read the bytes and * only read less bytes than the requested length if the end of * the stream has been reached.

* * @param input stream to read from * @param b buffer to fill * @param offset offset into the buffer to start filling at * @param len of bytes to read * @return the number of bytes actually read * @throws IOException * if an I/O error has occurred */ public static int readFully(final InputStream input, final byte[] b, final int offset, final int len) throws IOException { if (len < 0 || offset < 0 || len + offset > b.length) { throw new IndexOutOfBoundsException(); } int count = 0, x = 0; while (count != len) { x = input.read(b, offset + count, len - count); if (x == -1) { break; } count += x; } return count; } // toByteArray(InputStream) copied from: // commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?revision=1428941 // January 8th, 2013 // // Assuming our copy() works just as well as theirs! :-) /** * Gets the contents of an InputStream as a byte[]. *

* This method buffers the input internally, so there is no need to use a * BufferedInputStream. * * @param input the InputStream to read from * @return the requested byte array * @throws NullPointerException if the input is null * @throws IOException if an I/O error occurs * @since 1.5 */ public static byte[] toByteArray(final InputStream input) throws IOException { final ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output); return output.toByteArray(); } /** * Closes the given Closeable and swallows any IOException that may occur. * @param c Closeable to close, can be null * @since 1.7 */ public static void closeQuietly(final Closeable c) { if (c != null) { try { c.close(); } catch (final IOException ignored) { // NOPMD } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy