/*
* Copyright (C) 2007 The Guava Authors
*
* Licensed 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.facebook.common.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Provides utility methods for working with files.
*
* <p>All method parameters must be non-null unless documented otherwise.
*
* @author Chris Nokleberg
* @author Colin Decker
* @since 1.0
*/
public class Files {
private Files() {}
/**
* Reads a file of the given expected size from the given input stream, if
* it will fit into a byte array. This method handles the case where the file
* size changes between when the size is read and when the contents are read
* from the stream.
*/
static byte[] readFile(
InputStream in, long expectedSize) throws IOException {
if (expectedSize > Integer.MAX_VALUE) {
throw new OutOfMemoryError("file is too large to fit in a byte array: "
+ expectedSize + " bytes");
}
// some special files may return size 0 but have content, so read
// the file normally in that case
return expectedSize == 0
? ByteStreams.toByteArray(in)
: ByteStreams.toByteArray(in, (int) expectedSize);
}
/**
* Reads all bytes from a file into a byte array.
*
* @param file the file to read from
* @return a byte array containing all the bytes from file
* @throws IllegalArgumentException if the file is bigger than the largest
* possible byte array (2^31 - 1)
* @throws IOException if an I/O error occurs
*/
public static byte[] toByteArray(File file) throws IOException {
FileInputStream in = null;
try {
in = new FileInputStream(file);
return readFile(in, in.getChannel().size());
} finally {
if (in != null) {
in.close();
}
}
}
}