baby69yy2000 发表于 2013-2-3 14:08:24

[转]JAVA版文件MD5生成器

做文件传输的时候,为了保证文件是合法的有效的,经常会对文件做MD5校验,以确保和原始的文件是一样的.并且做断点续传的时候这一点也是挺重要的,其实JAVA处理这方面也挺不错的,可是我搜了半天,也没有搜到一个用JAVA写的文件MD5生成程序,有的也只是命令行模式下的,没有一个GUI模式的,所以就写了一个GUI的,方便使用,只用了两个类,一个是工具类,除了生成MD5外还可以生成SHA码,大家可以通过改源文件达到这一点,并且文件支持拖放,可以把要生成的文件拖到文本区,就可以显示这个文件的信息了.

/* * To change this template, choose Tools | Templates * and open the template in the editor. */package test1; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JProgressBar;/** * * @author hadeslee */public final class Util {    /**   * 得到文件的MD5码,用于校验   * @param file   * @param jpb      * @return   */    public static String getMD5(File file, JProgressBar jpb) {      FileInputStream fis = null;      jpb.setMaximum((int) file.length());      jpb.setValue(0);      jpb.setString("正在计算:" + file.getName() + "的MD5值");      try {            MessageDigest md = MessageDigest.getInstance("MD5");            fis = new FileInputStream(file);            byte[] buffer = new byte;            int length = -1;            System.out.println("开始算");            int value = 0;            while ((length = fis.read(buffer)) != -1) {                md.update(buffer, 0, length);                value += length;                jpb.setValue(value);            }            System.out.println("算完了");            return bytesToString(md.digest());      } catch (IOException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } catch (NoSuchAlgorithmException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } finally {            try {                fis.close();            } catch (IOException ex) {                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            }      }    }    /**   *      * @param file   * @return   */    public static String getMD5(File file) {      FileInputStream fis = null;      try {            MessageDigest md = MessageDigest.getInstance("MD5");            fis = new FileInputStream(file);            byte[] buffer = new byte;            int length = -1;            System.out.println("开始算");            while ((length = fis.read(buffer)) != -1) {                md.update(buffer, 0, length);            }            System.out.println("算完了");            return bytesToString(md.digest());      } catch (IOException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } catch (NoSuchAlgorithmException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } finally {            try {                fis.close();            } catch (IOException ex) {                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            }      }    }    /**   * 得到文件的SHA码,用于校验   * @param file   * @return   */    public static String getSHA(File file) {      FileInputStream fis = null;      try {            MessageDigest md = MessageDigest.getInstance("SHA");            fis = new FileInputStream(file);            byte[] buffer = new byte;            int length = -1;            System.out.println("开始算");            while ((length = fis.read(buffer)) != -1) {                md.update(buffer, 0, length);            }            System.out.println("算完了");            return bytesToString(md.digest());      } catch (IOException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } catch (NoSuchAlgorithmException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } finally {            try {                fis.close();            } catch (IOException ex) {                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            }      }    }      /**   *      * @param file   * @param jpb   * @return   */    public static String getSHA(File file,JProgressBar jpb) {      FileInputStream fis = null;      jpb.setMaximum((int) file.length());      jpb.setValue(0);      jpb.setString("正在计算:" + file.getName() + "的MD5值");      try {            MessageDigest md = MessageDigest.getInstance("SHA");            fis = new FileInputStream(file);            byte[] buffer = new byte;            int length = -1;            System.out.println("开始算");            int value=0;            while ((length = fis.read(buffer)) != -1) {                md.update(buffer, 0, length);                value+=length;                jpb.setValue(value);            }            System.out.println("算完了");            return bytesToString(md.digest());      } catch (IOException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } catch (NoSuchAlgorithmException ex) {            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            return null;      } finally {            try {                fis.close();            } catch (IOException ex) {                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);            }      }    }    public static String bytesToString(byte[] data) {      char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',                'e', 'f'};      char[] temp = new char;      for (int i = 0; i < data.length; i++) {            byte b = data;            temp = hexDigits;            temp = hexDigits;      }      return new String(temp);    }    public static void main(String[] args) {      String s = System.getProperties().getProperty("java.io.tmpdir");      System.out.println(s);    }}

窗体的代码:
* * Main.java * * Created on 2007年11月8日, 上午9:15 */package test1;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.awt.dnd.DnDConstants;import java.awt.dnd.DropTarget;import java.awt.dnd.DropTargetDragEvent;import java.awt.dnd.DropTargetDropEvent;import java.awt.dnd.DropTargetEvent;import java.awt.dnd.DropTargetListener;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.JFileChooser;import javax.swing.UIManager;/** * * @authorhadeslee */public class Main extends javax.swing.JFrame implements DropTargetListener {    private JFileChooser jfc;    private File toMd5;    private DropTarget dt;    /** Creates new form Main */    public Main() {      try {            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());      } catch (Exception exe) {            exe.printStackTrace();      }      initComponents();      initOther();      this.setLocationRelativeTo(null);    }    private void initOther() {      dt = new DropTarget(jTextArea1, DnDConstants.ACTION_COPY_OR_MOVE, this);    }    /** This method is called from within the constructor to   * initialize the form.   * WARNING: Do NOT modify this code. The content of this method is   * always regenerated by the Form Editor.   */    // <editor-fold defaultstate="collapsed" desc="Generated Code">    private void initComponents() {      jLabel1 = new javax.swing.JLabel();      jTextField1 = new javax.swing.JTextField();      jButton1 = new javax.swing.JButton();      jScrollPane1 = new javax.swing.JScrollPane();      jTextArea1 = new javax.swing.JTextArea();      jButton2 = new javax.swing.JButton();      jButton3 = new javax.swing.JButton();      jpb = new javax.swing.JProgressBar();      jLabel2 = new javax.swing.JLabel();      jTextField2 = new javax.swing.JTextField();      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);      setTitle("MD5生成");      setResizable(false);      jLabel1.setText("文件路径:");      jTextField1.setEditable(false);      jButton1.setText("浏览");      jButton1.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jButton1ActionPerformed(evt);            }      });      jScrollPane1.setBorder(javax.swing.BorderFactory.createTitledBorder("文件信息"));      jTextArea1.setColumns(20);      jTextArea1.setRows(5);      jScrollPane1.setViewportView(jTextArea1);      jButton2.setText("生成");      jButton2.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jButton2ActionPerformed(evt);            }      });      jButton3.setText("退出");      jButton3.addActionListener(new java.awt.event.ActionListener() {            public void actionPerformed(java.awt.event.ActionEvent evt) {                jButton3ActionPerformed(evt);            }      });      jLabel2.setText("MD5值:");      jTextField2.setEditable(false);      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());      getContentPane().setLayout(layout);      layout.setHorizontalGroup(            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)            .addGroup(layout.createSequentialGroup()                .addContainerGap()                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)                  .addGroup(layout.createSequentialGroup()                        .addComponent(jButton2)                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)                        .addComponent(jButton3)                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)                        .addComponent(jpb, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))                  .addGroup(layout.createSequentialGroup()                        .addComponent(jLabel2)                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)                        .addComponent(jTextField2))                  .addComponent(jScrollPane1)                  .addGroup(layout.createSequentialGroup()                        .addComponent(jLabel1)                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE)                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)                        .addComponent(jButton1)))                .addContainerGap(16, Short.MAX_VALUE))      );      layout.setVerticalGroup(            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)            .addGroup(layout.createSequentialGroup()                .addContainerGap()                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)                  .addComponent(jLabel1)                  .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)                  .addComponent(jButton1))                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE)                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)                  .addComponent(jLabel2)                  .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)                  .addComponent(jButton3)                  .addComponent(jpb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))                .addContainerGap())            .addGroup(layout.createSequentialGroup()                .addGap(267, 267, 267)                .addComponent(jButton2)                .addGap(10, 10, 10))      );      pack();    }// </editor-fold>    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {      // TODO add your handling code here:      if (jfc == null) {            jfc = new JFileChooser();            jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);      }      if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {            toMd5 = jfc.getSelectedFile();            jTextField1.setText(toMd5.toString());            showFileInfo();      }    }    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {      // TODO add your handling code here:      jButton2.setEnabled(false);      new Thread(){            public void run(){                String s=Util.getMD5(toMd5, jpb);                jTextField2.setText(s);                jButton2.setEnabled(true);            }      }.start();    }    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {      // TODO add your handling code here:      System.exit(0);    }    private void showFileInfo() {      if (toMd5 != null) {            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");            File f = toMd5;            StringBuilder sb = new StringBuilder();            sb.append("文件名称:").append(f.getName()).append('\n');            sb.append("文件大小:").append(f.length()).append('\n');            sb.append("文件最后修改日期:").append(sdf.format(new Date(f.lastModified()))).append("\n");            sb.append("文件属性:").append(f.canWrite() ? "读写" : "只读").append('\n');            jTextArea1.setText(sb.toString());      }    }    /**   * @param args the command line arguments   */    public static void main(String args[]) {      java.awt.EventQueue.invokeLater(new Runnable() {                  public void run() {                        new Main().setVisible(true);                  }                });    }    // Variables declaration - do not modify    private javax.swing.JButton jButton1;    private javax.swing.JButton jButton2;    private javax.swing.JButton jButton3;    private javax.swing.JLabel jLabel1;    private javax.swing.JLabel jLabel2;    private javax.swing.JScrollPane jScrollPane1;    private javax.swing.JTextArea jTextArea1;    private javax.swing.JTextField jTextField1;    private javax.swing.JTextField jTextField2;    private javax.swing.JProgressBar jpb;    // End of variables declaration    public void dragEnter(DropTargetDragEvent dtde) {      dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);    }    public void dragOver(DropTargetDragEvent dtde) {    }    public void dropActionChanged(DropTargetDragEvent dtde) {    }    public void dragExit(DropTargetEvent dte) {    }    public void drop(DropTargetDropEvent e) {      try {            if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {                Transferable tr = e.getTransferable();                e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);                @SuppressWarnings("unchecked")                java.util.List<File> list = (java.util.List<File>) tr.getTransferData(DataFlavor.javaFileListFlavor);                if (list.size() == 1) {                  File f = list.get(0);                  if (f.isFile()) {                        toMd5 = list.get(0);                        this.showFileInfo();                        jTextField1.setText(toMd5.toString());                  }                }                e.dropComplete(true);            }else {                e.rejectDrop();            }      } catch ( IOException io) {            io.printStackTrace();            e.rejectDrop();      } catch ( UnsupportedFlavorException ufe) {            ufe.printStackTrace();            e.rejectDrop();      }    }}

0x0f什么意思?
0x的意思就是16进制数(别告诉我这都不知道) 0f=15,所以0x0f就是表示一个16进制的数字,值15 char *pattern表示的是一个数组指针,就是一个8个大小的数组,成员都是char*指针 所以总的来说就是给一个char* 数组赋值,初始化为0x0f
页: [1]
查看完整版本: [转]JAVA版文件MD5生成器