Android File Create createChecksum(String path)

Here you can find the source of createChecksum(String path)

Description

Stores the checksum of a given directory tree in a file at the root of that directory.

License

Apache License

Exception

Parameter Description

Declaration

public static void createChecksum(String path) throws IOException 

Method Source Code

/*//from  ww w  . j a v a  2 s  .c om
Copyright 2008 Flaptor (flaptor.com) 

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.
 */

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
import org.apache.log4j.Logger;

public class Main{
    static final String CHECKSUM_FILENAME = "checksum";
    /**
     * Stores the checksum of a given directory tree in a file at the root of
     * that directory.
     * @throws java.io.IOException
     * @todo the serialization of the checksum is done using a hack. Serialize
     *    properly using ObjectOutputStream.writeLong
     */
    public static void createChecksum(String path) throws IOException {
        long checksum_long = computeChecksum(path);
        byte[] checksum = String.valueOf(checksum_long).getBytes();
        File f = new File(getDir(path), CHECKSUM_FILENAME);
        FileOutputStream os = new FileOutputStream(f);
        os.write(checksum); // checksum is long, write expects byte[]
        os.close();
    }
    /** 
     * Returns the checksum of a given directory tree. 
     * @throws java.io.IOException
     */
    public static long computeChecksum(String path) throws IOException {
        String dir = getDir(path);
        Checksum checksum = new CRC32();
        checksumDir(checksum, dir);
        return checksum.getValue();
    }
    /** 
     * Returns the absolute path of the given directory. 
     * @throws java.io.IOException
     * @todo see the method's body
     */
    public static String getDir(String path) throws IOException {
        File f = null;
        if (path.startsWith(Character.toString(File.separatorChar))) {
            f = new File(path);
        } else {//XXX TODO: is this necessary?
            f = new File(".", path);
        }
        return f.getCanonicalPath();
    }
    /**
     * Recursively computes the checksum of a given directory tree and adds it
     * to the provided Checksum object.
     * @throws java.io.FileNotFoundException, java.io.IOException
     */
    private static void checksumDir(Checksum chk, String path)
            throws IOException {
        File dir = new File(path);
        if (!dir.exists()) {
            throw new FileNotFoundException(
                    "FileUtil.checksumDir: The directory " + path
                            + " does not exist");
        }
        if (dir.isDirectory()) {
            String[] names = dir.list();
            // Needed because list() method may sort different the files
            // depending on implementation, and CRC32 is non-commutative.
            Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);
            for (int i = 0; i < names.length; i++) {
                if (!names[i].endsWith(CHECKSUM_FILENAME)) {
                    String filespec = path + File.separatorChar + names[i];
                    File file = new File(filespec);
                    if (file.isDirectory()) {
                        checksumDir(chk, filespec);
                    } else {
                        checksumFile(chk, filespec);
                    }
                }
            }
        }
    }
    /**
     * Computes the checksum of a given file and adds it to the provided
     * Checksum object.
     * 
     * @param chk the Checksum object.
     * @param fname the name of the file to check it's checksum.
     * @throws java.io.FileNotFoundException, java.io.IOException
     */
    private static void checksumFile(final Checksum chk, final String fname)
            throws IOException {
        BufferedInputStream bis = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(fname);
            bis = new BufferedInputStream(fis);
            int len = 0;
            byte[] bytes = new byte[8192];
            while ((len = bis.read(bytes)) >= 0) {
                chk.update(bytes, 0, len);
            }
        } finally {
            Execute.close(bis);
            Execute.close(fis);
        }
    }
}

Related

  1. createFile(File file, boolean isFile)
  2. createFile(String file, String content, String encodType)
  3. createFile(String fileName)
  4. createFile(String fileName)