CheckedInputStream&CheckedOutputStream

求和校驗

java.util.zip包中另外一些比較重要的類是Adler32和CRC32,它們實現了java.util.zip.Checksum接 口,並估算了壓縮數據的校驗和(checksum)。衆所周知,在運算速度方面,Adler32算法比CRC32算法要有一定的優勢;但在數據可信度方 面,CRC32算法則要更勝一籌。正所謂,"魚與熊掌,不可兼得。",大家只好在不同的場合下,加以取捨了。GetValue方法可以用來獲得當前的 checksum值,reset方法能夠重新設置checksum爲其缺省的值。

求和校驗一般用來校驗文件和信息是否正確的傳送。舉個例子,假設你想創建一個ZIP文件,然後將其傳送到遠程計算機上。當到達遠程計算機後,你就可 以使用checksum檢驗在傳輸過程中文件是否發生錯誤。爲了演示如何創建checksums,我們修改了例程1和例程3,在例程4和例程5中使用了兩 個新類,一個是CheckedInputStream,另一個是CheckedOutputStream。(大家注意:這兩段代碼在壓縮與解壓縮過程中, 使用了同一種算法,求數據的checksum值。)


例程4源代碼:

Zip.java 
import java.io.*;
import java.util.zip.*;
public class Zip {
static final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new
FileOutputStream("c://zip//myfigs.zip");
CheckedOutputStream checksum = new
CheckedOutputStream(dest, new Adler32());
ZipOutputStream out = new
ZipOutputStream(new
BufferedOutputStream(checksum));
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = new byte[BUFFER];
// get a list of files from current directory
File f = new File(".");
String files[] = f.list();
for (int i=0; i < files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new
FileInputStream(files[i]);
origin = new
BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i]);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0,
BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
System.out.println("checksum:
"+checksum.getChecksum().getValue());
} catch(Exception e) {
e.printStackTrace();
}
}
}




例程5源代碼:

UnZip.java 
import java.io.*;
import java.util.zip.*;
public class UnZip {
public static void main (String argv[]) {
try {
final int BUFFER = 2048;
BufferedOutputStream dest = null;
FileInputStream fis = new
FileInputStream(argv[0]);
CheckedInputStream checksum = new
CheckedInputStream(fis, new Adler32());
ZipInputStream zis = new
ZipInputStream(new
BufferedInputStream(checksum));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
FileOutputStream fos = new
FileOutputStream(entry.getName());
dest = new BufferedOutputStream(fos,
BUFFER);
while ((count = zis.read(data, 0,
BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
System.out.println("Checksum:
"+checksum.getChecksum().getValue());
} catch(Exception e) {
e.printStackTrace();
}
}
}

 

測試例程4和5,編譯類文件並運行類Zip來創建一個壓縮檔案(程序會計算出checksum值並顯示在屏幕上),然後運行UnZip類來解壓縮這 個檔案(屏幕上同樣會打印出一個checksum值)。兩個值必須完全相同,否則說明出錯了。Checksums在數據校驗方面非常有用。例如,你可以創 建一個ZIP文件,然後連同checksum值一同傳遞給你的朋友。你的朋友解壓縮文件後,將生成的checksum值與你提供的作一比較,如果相同則說 明在傳遞過程中沒有發生錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章