IoStreams.java
/*-
* #%L
* io.earcam.instrumental.io
* %%
* Copyright (C) 2018 earcam
* %%
* SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
*
* You <b>must</b> choose to accept, in full - any individual or combination of
* the following licenses:
* <ul>
* <li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
* <li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
* <li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
* <li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
* </ul>
* #L%
*/
package io.earcam.utilitarian.io;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UncheckedIOException;
import java.util.Objects;
import javax.annotation.ParametersAreNonnullByDefault;
import javax.annotation.WillNotClose;
@ParametersAreNonnullByDefault
public final class IoStreams {
private static final int BUFFER_SIZE = 8192;
private IoStreams()
{}
/**
* While waiting for Java9's {@code InputStream.readAllBytes()}
*
* @param input the stream to drain
* @return the byte array obtained from draining {@code input}
* @throws UncheckedIOException if an {@link IOException} this thrown
*/
public static byte[] readAllBytes(@WillNotClose InputStream input)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
transfer(input, baos);
return baos.toByteArray();
}
/**
* While waiting for Java9's {@code InputStream.transferTo(OutputStream)}
*
* @param input read from
* @param output write to, but does not close
* @return the total number of bytes transferred
* @throws UncheckedIOException if an {@link IOException} this thrown
*/
public static long transfer(@WillNotClose InputStream in, @WillNotClose OutputStream out)
{
Objects.requireNonNull(in, "in");
Objects.requireNonNull(out, "out");
byte[] buffer = new byte[BUFFER_SIZE];
long count = 0;
int read;
try {
while((read = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
out.write(buffer, 0, read);
count += read;
}
return count;
} catch(IOException e) {
throw new UncheckedIOException(e);
}
}
}