//实现生成MD5值
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Digest {
public Digest() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static StringBuilder check(String path) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
byte[] size = null;
StringBuilder noAlgorithm=new StringBuilder("无法使用MD5算法,这可能是你的JAVA虚拟机版本太低");
StringBuilder fileNotFound=new StringBuilder("未能找到文件,请重新定位文件路径");
StringBuilder IOerror=new StringBuilder("文件输入流错误");
try {
MessageDigest md5=MessageDigest.getInstance("MD5");//生成MD5类的实例
File file = new File(path); //创建文件实例,设置路径为方法参数
FileInputStream fs = new FileInputStream(file);
BufferedInputStream bi = new BufferedInputStream(fs);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] b = new byte[bi.available()]; //定义字节数组b大小为文件的不受阻塞的可访问字节数
int i;
//将文件以字节方式读到数组b中
while ((i = bi.read(b, 0, b.length)) != -1)
{
}
md5.update(b);//执行MD5算法
for (byte by : md5.digest())
{
sb.append(String.format("%02X", by));//将生成的字节MD5值转换成字符串
}
bo.close();
bi.close();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
return noAlgorithm;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
return fileNotFound;
} catch (IOException e) {
// TODO Auto-generated catch block
return IOerror;
}
return sb;//返回MD5值
}
}
//生成窗体类为主类
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import javax.swing.plaf.metal.MetalLookAndFeel;
public class MainFrame extends JFrame implements ActionListener,MouseListener{
JTextField fileSource=new JTextField(36);
JTextField produceMD5=new JTextField(36);
JTextField showEqual=new JTextField("请在此处输入源MD5值",36);
JButton choiceFile=new JButton("选择文件");
JButton createMD5=new JButton("生成MD5");
JButton judgement=new JButton("对比");
JPanel panel;
JFileChooser fileChooser=new JFileChooser();
public MainFrame() {
// TODO Auto-generated constructor stub
super("MD5工具");
//设置主窗体的观感为金属外观
try {
UIManager.setLookAndFeel(new MetalLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//窗体布局使用GridBagLayout
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
panel=new JPanel(gbl);
panel.setBorder(BorderFactory.createTitledBorder("xiaohb's MD5 check tool"));
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1.0;
gbc.weighty=1.0;
gbl.setConstraints(fileSource, gbc);
panel.add(fileSource);
gbc.weightx=0.0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gbl.setConstraints(choiceFile, gbc);
panel.add(choiceFile);
gbc.gridwidth=1;
gbl.setConstraints(produceMD5, gbc);
panel.add(produceMD5);
gbc.weightx=0.0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gbl.setConstraints(createMD5, gbc);
panel.add(createMD5);
gbc.gridwidth=1;
gbl.setConstraints(showEqual, gbc);
panel.add(showEqual);
gbc.weightx=0.0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gbl.setConstraints(judgement, gbc);
panel.add(judgement);
add(panel);
//给按钮添加注册器
showEqual.addMouseListener(this);
choiceFile.addActionListener(this);
createMD5.addActionListener(this);
judgement.addActionListener(this);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainFrame frame=new MainFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setSize(350, 200);
frame.setResizable(false);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Digest digest=new Digest();
JOptionPane prompt=new JOptionPane();
if(e.getSource()==choiceFile){
fileChooser.showOpenDialog(this);
fileSource.setText(fileChooser.getSelectedFile().toString());//显示选择的文件名
}else if(e.getSource()==createMD5){
produceMD5.setText((digest.check(fileSource.getText())).toString());//生成的MD5值显示在文本区域内
}else if(e.getSource()==judgement){
//判断MD5值是否相同
if(produceMD5.getText().equalsIgnoreCase(showEqual.getText())){
prompt.showMessageDialog(this, "两个MD5值相同,文件安全!");
}else{
prompt.showMessageDialog(this, "两个MD5值不同,文件可能被篡改,请检查!");
}
}
}
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==showEqual){
showEqual.setText("");
}
}
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}