com.aliyun.odps.commons.util.IOUtils Maven / Gradle / Ivy
/*
* 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 com.aliyun.odps.commons.util;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* IO Utils
*/
public class IOUtils {
public static final int READ_BUFFER_SIZE = 4096;
private static final int EOF = -1;
/**
* Read fully from the InputStream
*
* @param in
* @return
* @throws IOException
*/
public static byte[] readFully(InputStream in) throws IOException {
try {
byte[] buf = new byte[READ_BUFFER_SIZE];
int read = -1;
ByteArrayOutputStream os = new ByteArrayOutputStream();
while ((read = in.read(buf)) != -1) {
os.write(buf, 0, read);
}
os.close();
return os.toByteArray();
} finally {
if (in != null) {
in.close();
}
}
}
/**
* Get InputStream bytes count without reading
*
* @param in
* @return
* @throws IOException
*/
public static long getInputStreamLength(InputStream in) throws IOException {
if (in instanceof FileInputStream) {
return ((FileInputStream) in).getChannel().size();
}
return in.available();
}
/**
* Reset the InputStream to the beginning/mark position without a large buffer
*
* @param in
* @throws IOException
*/
public static void resetInputStream(InputStream in) throws IOException {
if (in.markSupported()) {
in.reset();
}
if (in instanceof FileInputStream) {
((FileInputStream) in).getChannel().position(0);
}
}
/**
* Copy bytes from a large (over 2GB) InputStream
to an
* OutputStream
.
*
* This method buffers the input internally, so there is no need to use a
* BufferedInputStream
.
*
* The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}.
*
* @param input
* the InputStream
to read from
* @param output
* the OutputStream
to write to
* @return the number of bytes copied
* @throws NullPointerException
* if the input or output is null
* @throws IOException
* if an I/O error occurs
* @since Shamelessly cloned from Apache Commons IO 1.3 IOUtils
*/
public static long copyLarge(InputStream input, OutputStream output) throws IOException {
return copyLarge(input, output, new byte[READ_BUFFER_SIZE]);
}
/**
* Copy bytes from a large (over 2GB) InputStream
to an
* OutputStream
.
*
* This method uses the provided buffer, so there is no need to use a
* BufferedInputStream
.
*
*
* @param input
* the InputStream
to read from
* @param output
* the OutputStream
to write to
* @param buffer
* the buffer to use for the copy
* @return the number of bytes copied
* @throws NullPointerException
* if the input or output is null
* @throws IOException
* if an I/O error occurs
* @since Shamelessly cloned from Apache Commons IO 2.2 IOUtils
*/
public static long copyLarge(InputStream input, OutputStream output, byte[] buffer)
throws IOException {
long count = 0;
int n = 0;
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
public static String readStreamAsString(InputStream in, String charset) throws IOException {
return new String(readFully(in), charset);
}
public static String readStreamAsString(InputStream in) throws IOException {
return new String(readFully(in), "utf-8");
}
}