/*
* $Id$
*
* Copyright (c) 2009 by Brent Easton
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.CRC32;
import VASSAL.tools.io.IOUtils;
/**
* Some general purpose CRC utilities.
*
* @author Brent Easton
* @since 3.1.0
*/
public class CRCUtils {
public static final int DEFAULT_BUFFER_SIZE = 8192;
/**
* Calculate a cumulative CRC over a series of files
*
* NOTE: It is up to the calling routine to ensure that the order of
* Files in the list is consistent accross all platforms.
*
* @param files List of files
* @return CRC
* @throws IOException
*/
public static long getCRC(List<File> files) throws IOException {
final CRC32 crc = new CRC32();
final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
for (File file : files) {
buildCRC(file, crc, buffer);
}
return crc.getValue();
}
/**
* Internal routine to accumulate a CRC over a single file
*
* @param file File
* @param crc CRC32 to accumulate
* @param bytes size of File (out)
* @param buffer read buffer
* @throws IOException
*/
private static void buildCRC(File file, CRC32 crc, byte[] buffer) throws IOException {
InputStream in = new FileInputStream(file);
try {
buildCRC(in, crc, buffer);
}
finally {
IOUtils.closeQuietly(in);
}
}
/**
* Internal routine to accumulate a CRC over a single InputStream
*
* @param in InputStream
* @param crc CRC32 to accumulate
* @param bytes number of bytes read
* @param buffer read buffer
* @throws IOException
*/
private static void buildCRC(InputStream in, CRC32 crc, byte[] buffer) throws IOException {
int count;
while ((count = in.read(buffer)) >= 0) {
crc.update(buffer, 0, count);
}
}
}